我的漫漫程序之旅

          專注于JavaWeb開發
          隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
          數據加載中……

          設計模式之學習 Memento模式

          一、Memento模式的目的:

          memento是一個保存另外一個對象內部狀態拷貝的對象.這樣以后就可以將該對象恢復到原先保存的狀態.

          二、Memento模式的簡單例子:

          下面的例子來源于Jdon網站的《GoF設計模式系列》的《Memento模式》,雖然簡單卻形象地表明了Memento模式的應用

          package com.pattern.memento2;

          /**
           * 原始對象
           * 
           * 
          @author zdw
           * 
           
          */

          public class Originator
          {
              
          private int age;
              
          private String name;

              
          public Memento getMemento()
              
          {
                  
          return new Memento(this);
              }

              
          //取出Memento中先前保存的數據,恢復為初始狀態
              public void setMemento(Memento m)
              
          {
                  
          this.setAge(m.getAge());
                  
          this.setName(m.getName());
              }


              
          public int getAge()
              
          {
                  
          return age;
              }


              
          public void setAge(int age)
              
          {
                  
          this.age = age;
              }


              
          public String getName()
              
          {
                  
          return name;
              }


              
          public void setName(String name)
              
          {
                  
          this.name = name;
              }

          }


          package com.pattern.memento2;
          /***
           * 備忘錄對象
           * 
          @author zdw
           *
           
          */

          public class Memento
          {
              
          private int age;
              
          private String name;

              
          public Memento(Originator o)
              
          {
                  
          this.age = o.getAge();
                  
          this.name = o.getName();
              }


              
          public int getAge()
              
          {
                  
          return age;
              }


              
          public void setAge(int age)
              
          {
                  
          this.age = age;
              }


              
          public String getName()
              
          {
                  
          return name;
              }


              
          public void setName(String name)
              
          {
                  
          this.name = name;
              }

          }

          測試類:
          package com.pattern.memento2;

          public class Client
          {

              
          public static void main(String[] args)
              
          {
                  Originator o 
          = new Originator();
                  o.setAge(
          18);
                  o.setName(
          "馬云");

                  o.setMemento(
          new Memento(o));

                  Memento m 
          = o.getMemento();

                  o.setAge(
          88);
                  o.setName(
          "God");
                  
          // o對象的先前值
                  System.out.println(m.getAge() + "\n" + m.getName());
                  
          // o對象的新值
                  System.out.println(o.getAge() + "\n" + o.getName());
              }


          }


          三、Memento模式的特點:

          在需要提供保存、恢復對象狀態的類中,必須提供兩個方法:

          .保存對象當前狀態方法:將對象自身(this)作為參數傳入,創建備忘錄。
          .恢復對象之前狀態的方法:取出備忘錄/接收一個備忘錄對象,從中獲取對象之前的狀態

          模式的缺點是耗費大,如果內部狀態很多,再保存一份,無意要浪費大量內存.

          注意:Memento模式保存的是操作前對象的狀態,而不是操作后對象的狀態;否則就沒辦法做恢復了



          posted on 2008-06-11 15:48 々上善若水々 閱讀(646) 評論(0)  編輯  收藏 所屬分類: 設計模式

          主站蜘蛛池模板: 海兴县| 大埔区| 隆昌县| 和政县| 陵川县| 宜丰县| 建水县| 东乌珠穆沁旗| 平凉市| 亳州市| 永泰县| 芜湖县| 赤壁市| 密云县| 永和县| 满洲里市| 永泰县| 偏关县| 海晏县| 皮山县| 和平县| 浦江县| 博客| 乐至县| 洛宁县| 依安县| 健康| 醴陵市| 林西县| 丹棱县| 二连浩特市| 昌黎县| 张家界市| 秦皇岛市| 江口县| 酒泉市| 宁夏| 屏边| 长丰县| 拜泉县| 应城市|