<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    DANCE WITH JAVA

    開發出高質量的系統

    常用鏈接

    統計

    積分與排名

    好友之家

    最新評論

    Java中的模式 --- 雙重接口的實現,備忘錄模式

    一、定義:備忘錄(memento)模式又叫快照(snapshot)模式或者token模式,主要功能:
    備忘錄模式是用一個對象來存儲另外一個對象的內部狀態的快照,實現備忘錄模式的關鍵點是在不破壞封裝的
    情況下,將一個對象的狀態捕捉住,并外部化,存儲起來,從而可以在合適的時候,把這個對象還原。
    說明:備忘錄模式適模式中比較好理解的一個,這里就不舉例子,但是備忘錄模式是模式中實現比較難,或者說
    實現比較巧的,這里主要說說。
    二、備忘錄模式的實現
    1,備忘錄模式中的角色
    發起人:創建含有內部狀態的備忘錄對象,并使用備忘錄對象存儲狀態
    負責人:負責人保存備忘錄對象,但不檢查備忘錄對象的內容
    備忘錄:備忘錄對象將發起人對象的內部狀態存起來,并保正其內容不被發起人對象之外的對象像讀取
    注意:在備忘錄的角色中,定義了他必須對不同的人提供不同的接口,對發起人提供寬接口,對其它任何人提供窄
    接口。也許你說我都提供寬接口得了。對這也是備忘錄的一種實現,叫做白箱備忘錄,不過這種方法的封裝沒有設計
    好,安全性不夠好。
    2,白箱備忘錄的實現:
     1public class Originator{
     2    private String state;
     3    public Memento CreateMemento(){
     4        return new Memento(state);
     5    }

     6    public void restoreMemento(Memento memento){
     7        this.state = memento.getState();
     8    }

     9    public String getState(){
    10        return this.state;
    11    }

    12    public void setState(String state){
    13        this.state=state;
    14        System.out.println("Current state = " + this.state);
    15    }

    16}

    17public class Memento{
    18    private String state;
    19    public Memento(String state){
    20        this.state = state;
    21    }

    22    public String getState(){
    23        return this.state;
    24    }

    25    public void setState(){
    26        this.state = state;
    27    }

    28}

    29public class Caretaker{
    30    private Memento memento;
    31    public Memento retrieveMemento(){
    32        return this.memento;
    33    }

    34    public void saveMemento(Memento memento){
    35        this.memento = memento;
    36    }

    37}

    38public class Client{
    39    private static Originator o = new Originator();
    40    private static Caretaker c = new Caretaker();
    41    public static void main(Sting[] args){
    42        o.setState("ON");
    43        c.saveMemento(o.createMemento());
    44        o.setState("OFF");
    45        o.restoreMemento(c.retrieveMemento());
    46    }

    47}
    白箱的優點:實現簡單
    白箱的缺點:上邊說了,破壞了封裝,安全性有些問題。
    說明:這里白箱的實現只保存了一個狀態,其實是可以保存多個狀態的。
    3,雙接口的實現,寬窄接口(黑箱)
    如何實現寬窄接口呢,內部類也許是個好方法。我們把備忘錄類設計"成發起人"的內部類,但這樣還有的問題是同一
    package中的其它類也能訪問到,為了解決這個問題,我們可以把"備忘錄"的方法設計成私有的方法,這樣就
    可以保正封裝,又保正發起人能訪問到。實現如下:
    定義窄接口.
     1public interface NarrowMemento{
     2    public void narrowMethod();
     3}

     4class Originator {
     5    private String state;
     6    private NarrowMemento memento;
     7    public Originator(){
     8    }

     9    public NarrowMemento createMemento(){
    10        memento = new Memento(this.state);
    11        return memento;
    12    }

    13    public void restoreMemento(NarrowMemento memento){
    14        Memento aMemento = (Memento)memento;
    15        this.setState(aMemento.getState());
    16    }

    17    public String getState(){
    18        return this.state;
    19    }

    20    public void setState(String state){
    21        this.state = state;
    22    }

    23    //內部類
    24    protected class Memento implements NarrowMemento{
    25        private String savedState;
    26        private Memento(String someState){
    27            saveState = someState;
    28        }

    29        private void setState(String someState){
    30            saveState = someState;
    31        }

    32        private String getState(){
    33            return saveState;
    34        }

    35        public void narrowMethod(){
    36            System.out.println("this is narrow method");
    37        }

    38        
    39    }

    40    public NarrowMemento getNarrowMemento(){
    41        return memento;
    42    }

    43}

    44public class Caretaker{
    45    private NarrowMemento memento;
    46    public NarrowMemento retrieveMemento(){
    47        return this.memento;
    48    }

    49    public void saveMemento(NarrowMemento memento){
    50        this.memento = memento;
    51    }

    52}

    53public class Client{
    54    private static Originator o = new Originator();
    55    private static Caretaker c = new Caretaker();
    56    public static void main(String[] args){
    57        //use wide interface
    58        o.setState("On");
    59        c.saveMemento(o.createMemento());
    60        o.setState("Off");
    61        o.restoreMemento(c.retrieveMemento());
    62        //use narrow interface
    63        NarrowMemento memento = o.getNarrowMemento();
    64        memento.narrowMethod();
    65        
    66    }

    67}
    ok,實現了對大多數人實現比較窄的接口,對Originator實現了寬接口.
    三,最后的一些說明:
    1,前邊兩個例子都是記錄了單個狀態(單check點),要實現多個狀態點很容易,只須要把記錄state的字符串換
    成一個list,然後添加,取得。如果須要隨機須得狀態點,也可以用map來存放.這樣多個check點就實現了。
    2,一般情況下可以擴展負責人的功能,讓負責人的功能更強大,從而讓客戶端的操做更少些。解放客戶端。
    3,自述歷史模式,這個就是把發起人,負責人寫在一個類中,平時的應用中這種方法比較常見。

    posted on 2006-12-03 10:40 dreamstone 閱讀(2531) 評論(1)  編輯  收藏 所屬分類: 設計模式

    評論

    # re: Java中的模式 --- 雙重接口的實現,備忘錄模式 2007-08-04 21:36 游客

    "開發出高質量的系統",我們需要你這樣的人,這樣的思想,這樣的文章,謝謝分享!  回復  更多評論   

    主站蜘蛛池模板: 国产成人综合亚洲一区| 又黄又爽又成人免费视频| 91在线精品亚洲一区二区| 免费精品国产自产拍在线观看图片| 亚洲综合一区无码精品| 亚洲一区二区三区在线播放| 9277手机在线视频观看免费| 亚洲日本一线产区和二线产区对比| 久久精品夜色噜噜亚洲A∨| 亚洲成年人免费网站| 乱爱性全过程免费视频| 亚洲春色另类小说| 亚洲一级Av无码毛片久久精品| 国产精品入口麻豆免费观看| 在线播放国产不卡免费视频| 亚洲人成7777影视在线观看| 亚洲精品WWW久久久久久| 成人免费AA片在线观看| 国产无遮挡无码视频免费软件 | 亚洲av中文无码乱人伦在线咪咕| 国产免费看JIZZ视频| 国产亚洲精品免费视频播放| 亚洲欧美国产精品专区久久| 亚洲VA中文字幕不卡无码| 情侣视频精品免费的国产| 114级毛片免费观看| 精品熟女少妇aⅴ免费久久| 亚洲AV无码之国产精品| 一日本道a高清免费播放| 亚洲免费二区三区| 亚洲av永久无码精品秋霞电影影院 | 男女男精品网站免费观看| 亚洲免费一级视频| 久久精品夜色国产亚洲av| 久久激情亚洲精品无码?V| 日本特黄特黄刺激大片免费| 91频在线观看免费大全| 十八禁无码免费网站| a毛片全部免费播放| 免费一区二区三区在线视频 | 国产亚洲成在线播放va|