亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

備忘錄模式-對象行為型

asal 2016-11-09 15:46:48 514
abstrak:原理備忘錄對象是一個用來存儲另外一個對象內(nèi)部狀態(tài)的快照的對象。備忘錄模式的用意是在不破壞封裝的條件下,將一個對象的狀態(tài)捕捉(Capture)住,并外部化,存儲起來,從而可以在將來合適的時候把這個對象還原到存儲起來的狀態(tài)。備忘錄模式常常與命令模式和迭代子模式一同使用。組成  備忘錄模式所涉及的角色有三個:備忘錄(Memento)角色、發(fā)起人(Originator)角色、負責人(Caretaker)角

原理

備忘錄對象是一個用來存儲另外一個對象內(nèi)部狀態(tài)的快照的對象。備忘錄模式的用意是在不破壞封裝的條件下,將一個對象的狀態(tài)捕捉(Capture)住,并外部化,存儲起來,從而可以在將來合適的時候把這個對象還原到存儲起來的狀態(tài)。備忘錄模式常常與命令模式和迭代子模式一同使用。

組成

下載.png

  備忘錄模式所涉及的角色有三個:備忘錄(Memento)角色、發(fā)起人(Originator)角色、負責人(Caretaker)角色。

備忘錄(Memento)角色又如下責任:

 ?。?)將發(fā)起人(Originator)對象的內(nèi)戰(zhàn)狀態(tài)存儲起來。備忘錄可以根據(jù)發(fā)起人對象的判斷來決定存儲多少發(fā)起人(Originator)對象的內(nèi)部狀態(tài)。

 ?。?)備忘錄可以保護其內(nèi)容不被發(fā)起人(Originator)對象之外的任何對象所讀取。

發(fā)起人(Originator)角色有如下責任:

 ?。?)創(chuàng)建一個含有當前的內(nèi)部狀態(tài)的備忘錄對象。

 ?。?)使用備忘錄對象存儲其內(nèi)部狀態(tài)。

負責人(Caretaker)角色有如下責任:

 ?。?)負責保存?zhèn)渫泴ο蟆?/p>

 ?。?)不檢查備忘錄對象的內(nèi)容。

 “自述歷史”模式

  所謂“自述歷史”模式(History-On-Self Pattern)實際上就是備忘錄模式的一個變種。在備忘錄模式中,發(fā)起人(Originator)角色、負責人(Caretaker)角色和備忘錄(Memento)角色都是獨立的角色。雖然在實現(xiàn)上備忘錄類可以成為發(fā)起人類的內(nèi)部成員類,但是備忘錄類仍然保持作為一個角色的獨立意義。在“自述歷史”模式里面,發(fā)起人角色自己兼任負責人角色。

  “自述歷史”模式的類圖如下所示:

下載 (1).png

  備忘錄角色有如下責任:

  (1)將發(fā)起人(Originator)對象的內(nèi)部狀態(tài)存儲起來。

 ?。?)備忘錄可以保護其內(nèi)容不被發(fā)起人(Originator)對象之外的任何對象所讀取。

  發(fā)起人角色有如下責任:

 ?。?)創(chuàng)建一個含有它當前的內(nèi)部狀態(tài)的備忘錄對象。

 ?。?)使用備忘錄對象存儲其內(nèi)部狀態(tài)。

 客戶端角色有負責保存?zhèn)渫泴ο蟮呢熑巍?/p>

  源代碼

  窄接口MementoIF,這是一個標識接口,因此它沒有定義出任何的方法。

public interface MementoIF {
}

  發(fā)起人角色同時還兼任負責人角色,也就是說它自己負責保持自己的備忘錄對象?!?nbsp;

public class Originator {
   public String state;
   /**
    * 改變狀態(tài)
    */
   public void changeState(String state){
       this.state = state;
       System.out.println("狀態(tài)改變?yōu)椋?quot; + state);
   }
   /**
    * 工廠方法,返還一個新的備忘錄對象
    */
   public Memento createMemento(){
       return new Memento(this);
   }
   /**
    * 將發(fā)起人恢復到備忘錄對象所記錄的狀態(tài)上
    */
   public void restoreMemento(MementoIF memento){
       Memento m = (Memento)memento;
       changeState(m.state);
   }
   
   private class Memento implements MementoIF{
       
       private String state;
       /**
        * 構(gòu)造方法
        */
       private Memento(Originator o){
           this.state = o.state;
       }
       private String getState() {
           return state;
       }
       
   }
}

  客戶端角色類

public class Client {
   public static void main(String[] args) {
       Originator o = new Originator();
       //修改狀態(tài)
       o.changeState("state 0");
       //創(chuàng)建備忘錄
       MementoIF memento = o.createMemento();
       //修改狀態(tài)
       o.changeState("state 1");
       //按照備忘錄恢復對象的狀態(tài)
       o.restoreMemento(memento);
   }
}

  由于“自述歷史”作為一個備忘錄模式的特殊實現(xiàn)形式非常簡單易懂,它可能是備忘錄模式最為流行的實現(xiàn)形式。


Nota Keluaran

Penyertaan Popular