PHP設計模式學習筆記: 備忘錄模式(Memento)
// 閱讀器類 class BookReader {
private $title;
private $page;
function __construct($title_in, $page_in) { $this->setPage($page_in); $this->setTitle($title_in); }
public function getPage() { return $this->page; }
public function setPage($page_in) { $this->page = $page_in; } public function getTitle() { return $this->title; }
public function setTitle($title_in) { $this->title = $title_in; } }// 備忘閱讀器類的類 class BookMark {
private $title;
private $page;
function __construct(BookReader $bookReader) { $this->setPage($bookReader); $this->setTitle($bookReader);
}
public function getPage(BookReader $bookReader) { $bookReader->setPage($this->page); }
public function setPage(BookReader $bookReader) { $this->page = $bookReader->getPage(); }
public function getTitle(BookReader $bookReader) { $bookReader->setTitle($this->title); }
public function setTitle(BookReader $bookReader) { $this->title = $bookReader->getTitle(); }
}writeln('開始測試備忘錄模式'); writeln('');
$bookReader = new BookReader('哈利波特與火焰杯','103'); $bookMark = new BookMark($bookReader);
writeln('(最開始的時候) bookReader 的標題是: '.$bookReader->getTitle()); writeln('(最開始的時候) bookReader 的頁碼是: '.$bookReader->getPage());
$bookReader->setPage("104"); $bookMark->setPage($bookReader); writeln('(翻過去一頁后) bookReader 的頁碼是: '.$bookReader->getPage());
$bookReader->setPage('2005'); //oops! a typo 突然翻得太快了 writeln('(打字錯誤,翻得太快了) bookReader 的頁碼是: '.$bookReader->getPage());
print_r($bookMark); / $bookMark仍然存儲著page的原始狀態 BookMark Object ( [title:BookMark:private] => 哈利波特與火焰杯 [page:BookMark:private] => 104 ) /
print_r($bookReader); / $bookReader的頁碼狀態已經改變 BookReader Object ( [title:BookReader:private] => 哈利波特與火焰杯 [page:BookReader:private] => 2005 ) /
// 用備忘錄類來重設頁碼,即用備忘錄類備忘下來的狀態信息重設一個類的狀態值 $bookMark->getPage($bookReader); writeln('(回到翻回去一頁后) bookReader 的頁碼是: '.$bookReader->getPage());
writeln('');writeln('結束測試備忘錄模式');
function writeln($line_in) { echo $line_in.PHP_EOL; }</pre>結果:
開始測試備忘錄模式(最開始的時候) bookReader 的標題是: 哈利波特與火焰杯 (最開始的時候) bookReader 的頁碼是: 103 (翻過去一頁后) bookReader 的頁碼是: 104 (打字錯誤,翻得太快了) bookReader 的頁碼是: 2005 (回到翻回去一頁后) bookReader 的頁碼是: 104
結束測試備忘錄模式</pre>