PHP設計模式學習筆記: 策略模式
// 策略生成器(有點相當于工廠)
class StrategyContext {
private $strategy = NULL;
//bookList is not instantiated at construct time
public function __construct($strategy_ind_id) {
switch ($strategy_ind_id) {
case "Makeupper":
$this->strategy = new StrategyMakeupper();
break;
case "Makeimportant":
$this->strategy = new StrategyMakeimportant();
break;
case "Makefavorate":
$this->strategy = new StrategyMakefavorate();
break;
}
}
public function showBookTitle($book) {
return $this->strategy->showTitle($book);
}
}
// 定義一個策略接口,讓所有實現該接口的策略類都保持有showTitle()這個規范的方法
interface StrategyInterface {
public function showTitle($book_in);
}
class StrategyMakeupper implements StrategyInterface {
public function showTitle($book_in) {
$title = $book_in->getTitle();
return strtoupper($title);
}
}
class StrategyMakeimportant implements StrategyInterface {
public function showTitle($book_in) {
$title = $book_in->getTitle();
return str_replace(' ','!',$title);
}
}
class StrategyMakefavorate implements StrategyInterface {
public function showTitle($book_in) {
$title = $book_in->getTitle();
return str_replace(' ','*',$title);
}
}
class Book {
private $author;
private $title;
function __construct($title_in, $author_in) {
$this->author = $author_in;
$this->title = $title_in;
}
function getAuthor() {
return $this->author;
}
function getTitle() {
return $this->title;
}
function getAuthorAndTitle() {
return $this->getTitle() . ' by ' . $this->getAuthor();
}
}
writeln('開始測試策略模式');
writeln('');
$book = new Book('這是書名標題《abc》 ^o^');
// 給策略生成器工廠傳遞一個策略參數,就得到了不同的策略對象
$strategyContextMakeupper = new StrategyContext('Makeupper');
$strategyContextMakeimportant = new StrategyContext('Makeimportant');
$strategyContextMakefavorate = new StrategyContext('Makefavorate');
writeln('測試 1 - 顯示大寫后的書名');
// 調用策略對象的方法都是一樣的( showBookTitle() ),給其傳遞的參數也是一樣的($book)
// 但因為策略對象不一樣,所以結果不一樣。對象不同,結果不同,結果不同的根本原因在于傳遞了不同的“策略參數”
writeln($strategyContextMakeupper->showBookTitle($book));
writeln('');
writeln('測試 2 - 顯示標識為重要的書名');
writeln($strategyContextMakeimportant->showBookTitle($book));
writeln('');
writeln('測試 3 - 顯示標識為收藏的書名');
writeln($strategyContextMakefavorate->showBookTitle($book));
writeln('');
writeln('結束測試策略模式');
function writeln($line_in) {
echo $line_in.PHP_EOL;
}</pre>
結果:
開始測試策略模式
測試 1 - 顯示大寫后的書名
這是書名標題《ABC》 ^O^
測試 2 - 顯示標識為重要的書名
這是書名標題《abc》!!^o^
測試 3 - 顯示標識為收藏的書名
這是書名標題《abc》**^o^
結束測試策略模式