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>