<?php //備忘錄模式定義:備忘錄模式又叫作快照模式或Token模式,在不破壞封閉的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態。這樣之後就可將該對象恢復到原先保存的狀態。 // 角色: //1.發起人:負責建立一個備忘錄,用以記錄當前時刻自身的內部狀態,並可以使用備忘錄恢復內部狀態。發起人可以依據需要決定備忘錄存儲本身的哪些內部狀態。 //2.備忘錄:負責存儲發起人對象的內部狀態,並可以防止發起人之外的其它對象訪問備忘錄。備忘錄有兩個接口:管理者僅僅能看到備忘錄的窄接口,他僅僅能將備忘錄傳遞給其它對象。發起人卻可看到備忘錄的寬接口。贊成它訪問返回到先前狀態所需要的所有數據。 //3.管理者:負責存取備忘錄,不能對內容進行訪問或者操做。 /** * 發起人類 */ class Sponsor{ public $time = 36000; public $title = "奮鬥者"; public $money = 0; public function subTime(){ $this->time --; } public function addMoney(){ $this->money += 1000; } public function changeTitle($title){ $this->title = $title; } /** * 備份當前的基礎數據屬性 * @dateTime 2017-02-13 */ public function backup(){ return new Backup($this->time,$this->money,$this->title); } /** * 數據還原 * @dateTime 2017-02-13 */ public function reback(Backup $backup){ $this->time = $backup->time; $this->title = $backup->title; $this->money = $backup->money; } } /** * 存儲類 */ class Backup{ public $time; public $title; public $money; public function __construct($time,$money,$title){ $this->time = $time; $this->title = $title; $this->money = $money; } } /** * 管理者類 */ class Manager{ public $data; } //客戶端應用 $Sponsor = new Sponsor(); //備份初始狀態 $Manager = new Manager(); $Manager->data = $Sponsor -> backup(); while($Sponsor->time > 0){ $Sponsor -> addMoney(); $Sponsor -> subTime(); if($Sponsor->money >= 1000000) $Sponsor -> changeTitle("驕傲者"); if($Sponsor->money >= 10000000) $Sponsor -> changeTitle("能力者"); if($Sponsor->money >= 100000000) $Sponsor -> changeTitle("成功者"); } var_dump($Sponsor); //還原初始狀態 $Sponsor->reback($Manager->data); var_dump($Sponsor);