<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## **模式的定義與特點** 備忘錄(Memento)模式的定義:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態,以便以后當需要時能將該對象恢復到原先保存的狀態。該模式又叫快照模式。 >很多應用軟件都提供了這項功能,如 Word、記事本、Photoshop、Eclipse 等軟件在編輯時按 Ctrl+Z 組合鍵時能撤銷當前操作,使文檔恢復到之前的狀態;還有在 IE 中的后退鍵、數據庫事務管理中的回滾操作、玩游戲時的中間結果存檔功能、數據庫與操作系統的備份操作、棋類游戲中的悔棋功能等都屬于這類 **優點:** * 提供了一種可以恢復狀態的機制。當用戶需要時能夠比較方便地將數據恢復到某個歷史的狀態。 * 實現了內部狀態的封裝。除了創建它的發起人之外,其他對象都不能夠訪問這些狀態信息。 * 簡化了發起人類。發起人不需要管理和保存其內部狀態的各個備份,所有狀態信息都保存在備忘錄中,并由管理者進行管理,這符合單一職責原則。 **缺點:** * 資源消耗大。如果要保存的內部狀態信息過多或者特別頻繁,將會占用比較大的內存資源。 ## **模式的應用場景** 1. 需要保存與恢復數據的場景,如玩游戲時的中間結果的存檔功能。 2. 需要提供一個可回滾操作的場景,如 Word、記事本、Photoshop,Eclipse 等軟件在編輯時按 Ctrl+Z 組合鍵,還有數據庫中事務操作。 ## **模式的結構** 備忘錄模式的核心是設計**備忘錄類**以及用于**管理備忘錄的管理者類** 1. 發起人(Originator)角色:記錄當前時刻的內部狀態信息,提供創建備忘錄和恢復備忘錄數據的功能,實現其他業務功能,它可以訪問備忘錄里的所有信息。 2. 備忘錄(Memento)角色:負責存儲發起人的內部狀態,在需要的時候提供這些內部狀態給發起人。 3. 管理者(Caretaker)角色:對備忘錄進行管理,提供保存與獲取備忘錄的功能,但其不能對備忘錄的內容進行訪問與修改。 備忘錄模式的結構圖如圖 ![](https://img.kancloud.cn/66/22/66229341ef45799d24331b9b0611c1a7_568x365.png) ``` //備忘錄 : 負責存儲發起人的內部狀態,在需要的時候提供這些內部狀態給發起人 class Memento { private $state=""; /** * 實例設置初始狀態 * @param String $state */ public function __construct(String $state) { $this->state=$state; } /** * 記錄狀態 * @param String $state */ public function setState(String $state) { $this->state=$state; } /** * 獲取狀態 * @return string */ public function getState() { return $this->state; } } //發起人: 記錄當前時刻的內部狀態信息,提供創建備忘錄和恢復備忘錄數據的功能,實現其他業務功能,它可以訪問備忘錄里的所有信息 class Originator { private $state=""; public function setState(String $state) { $this->state=$state; } public function getState() { return $this->state; } /** * 創建備忘錄 * @return Memento 返回備忘錄類實例 */ public function createMemento() { return new Memento($this->state); } /** * 恢復備忘錄中記錄的狀態 * @param Memento $m 備忘錄實例 * @return string */ public function restoreMemento(Memento $m) { $this->setState($m->getState()); } } //管理者: 對備忘錄進行管理,提供保存與獲取備忘錄的功能,但其不能對備忘錄的內容進行訪問與修改 class Caretaker { private $memento; /** * 保存備忘錄實例 * @param Memento $m 備忘錄實例 */ public function setMemento(Memento $m) { $this->memento=$m; } /** * 獲取備忘錄實例 * @return Memento */ public function getMemento() { return $this->memento; } } class MementoPattern { public static function main() { //發起人 $or=new Originator(); //管理者 $cr=new Caretaker(); //發起人設置狀態 $or->setState("s0"); print_r("初始狀態:".$or->getState()); //管理者 將發起人創建的備忘錄保存起來 $cr->setMemento($or->createMemento()); //保存狀態 $or->setState("S1"); print_r("新的狀態:".$or->getState()); $or->restoreMemento($cr->getMemento()); //恢復狀態 print_r("恢復狀態:".$or->getState()); } } MementoPattern::main(); ``` ## 模式的擴展 在前面介紹的備忘錄模式中,有單狀態備份的例子,也有多狀態備份的例子。 下面介紹備忘錄模式如何同[原型模式](http://c.biancheng.net/view/1343.html)混合使用。在備忘錄模式中,通過定義“備忘錄”來備份“發起人”的信息,而原型模式的 clone() 方法具有自備份功能,所以,如果讓發起人實現 Cloneable 接口就有備份自己的功能,這時可以刪除備忘錄類,其結構圖如圖 所示。 ![](https://img.kancloud.cn/94/01/9401805ef401f4fa0384177e61fa24c0_787x420.png) ``` //聲明一個克隆自身的接口 interface Cloneable { function clone(); } //發起人原型 class OriginatorPrototype implements Cloneable{ private $state; public function setState(String $state){ $this->state=$state; } public function getState(){ return $this->state; } public function createMemento(){ return $this->clone(); } public function restoreMemento(OriginatorPrototype $opt){ $this->setState($opt->getState()); } public function clone(){ return clone $this; } } //原型管理者 class PrototypeCaretaker { private $opt; public function setMemento(OriginatorPrototype $opt) { $this->opt=$opt; } public function getMemento() { return $this->opt; } } $originatorPrototype=new OriginatorPrototype(); $prototypeCaretaker=new PrototypeCaretaker(); //發起人改變狀態 $originatorPrototype->setState("s0"); echo "初始狀態:".$originatorPrototype->getState(); //管理者保存設置好以后的狀態(將發起者類實例存入) $prototypeCaretaker->setMemento($originatorPrototype->createMemento()); //發起人再次改變狀態 $originatorPrototype->setState("s1"); echo "新的狀態:".$originatorPrototype->getState(); //發起人恢復狀態 $originatorPrototype->restoreMemento($prototypeCaretaker->getMemento()); echo "恢復狀態:".$originatorPrototype->getState(); ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看