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

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

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

    DANCE WITH JAVA

    開(kāi)發(fā)出高質(zhì)量的系統(tǒng)

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    好友之家

    最新評(píng)論

    Java中的模式 --- 雙重接口的實(shí)現(xiàn),備忘錄模式

    一、定義:備忘錄(memento)模式又叫快照(snapshot)模式或者token模式,主要功能:
    備忘錄模式是用一個(gè)對(duì)象來(lái)存儲(chǔ)另外一個(gè)對(duì)象的內(nèi)部狀態(tài)的快照,實(shí)現(xiàn)備忘錄模式的關(guān)鍵點(diǎn)是在不破壞封裝的
    情況下,將一個(gè)對(duì)象的狀態(tài)捕捉住,并外部化,存儲(chǔ)起來(lái),從而可以在合適的時(shí)候,把這個(gè)對(duì)象還原。
    說(shuō)明:備忘錄模式適模式中比較好理解的一個(gè),這里就不舉例子,但是備忘錄模式是模式中實(shí)現(xiàn)比較難,或者說(shuō)
    實(shí)現(xiàn)比較巧的,這里主要說(shuō)說(shuō)。
    二、備忘錄模式的實(shí)現(xiàn)
    1,備忘錄模式中的角色
    發(fā)起人:創(chuàng)建含有內(nèi)部狀態(tài)的備忘錄對(duì)象,并使用備忘錄對(duì)象存儲(chǔ)狀態(tài)
    負(fù)責(zé)人:負(fù)責(zé)人保存?zhèn)渫泴?duì)象,但不檢查備忘錄對(duì)象的內(nèi)容
    備忘錄:備忘錄對(duì)象將發(fā)起人對(duì)象的內(nèi)部狀態(tài)存起來(lái),并保正其內(nèi)容不被發(fā)起人對(duì)象之外的對(duì)象像讀取
    注意:在備忘錄的角色中,定義了他必須對(duì)不同的人提供不同的接口,對(duì)發(fā)起人提供寬接口,對(duì)其它任何人提供窄
    接口。也許你說(shuō)我都提供寬接口得了。對(duì)這也是備忘錄的一種實(shí)現(xiàn),叫做白箱備忘錄,不過(guò)這種方法的封裝沒(méi)有設(shè)計(jì)
    好,安全性不夠好。
    2,白箱備忘錄的實(shí)現(xiàn):
     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}
    白箱的優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單
    白箱的缺點(diǎn):上邊說(shuō)了,破壞了封裝,安全性有些問(wèn)題。
    說(shuō)明:這里白箱的實(shí)現(xiàn)只保存了一個(gè)狀態(tài),其實(shí)是可以保存多個(gè)狀態(tài)的。
    3,雙接口的實(shí)現(xiàn),寬窄接口(黑箱)
    如何實(shí)現(xiàn)寬窄接口呢,內(nèi)部類也許是個(gè)好方法。我們把備忘錄類設(shè)計(jì)"成發(fā)起人"的內(nèi)部類,但這樣還有的問(wèn)題是同一
    package中的其它類也能訪問(wèn)到,為了解決這個(gè)問(wèn)題,我們可以把"備忘錄"的方法設(shè)計(jì)成私有的方法,這樣就
    可以保正封裝,又保正發(fā)起人能訪問(wèn)到。實(shí)現(xiàn)如下:
    定義窄接口.
     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    //內(nèi)部類
    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,實(shí)現(xiàn)了對(duì)大多數(shù)人實(shí)現(xiàn)比較窄的接口,對(duì)Originator實(shí)現(xiàn)了寬接口.
    三,最后的一些說(shuō)明:
    1,前邊兩個(gè)例子都是記錄了單個(gè)狀態(tài)(單check點(diǎn)),要實(shí)現(xiàn)多個(gè)狀態(tài)點(diǎn)很容易,只須要把記錄state的字符串換
    成一個(gè)list,然後添加,取得。如果須要隨機(jī)須得狀態(tài)點(diǎn),也可以用map來(lái)存放.這樣多個(gè)check點(diǎn)就實(shí)現(xiàn)了。
    2,一般情況下可以擴(kuò)展負(fù)責(zé)人的功能,讓負(fù)責(zé)人的功能更強(qiáng)大,從而讓客戶端的操做更少些。解放客戶端。
    3,自述歷史模式,這個(gè)就是把發(fā)起人,負(fù)責(zé)人寫(xiě)在一個(gè)類中,平時(shí)的應(yīng)用中這種方法比較常見(jiàn)。

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

    評(píng)論

    # re: Java中的模式 --- 雙重接口的實(shí)現(xiàn),備忘錄模式 2007-08-04 21:36 游客

    "開(kāi)發(fā)出高質(zhì)量的系統(tǒng)",我們需要你這樣的人,這樣的思想,這樣的文章,謝謝分享!  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 草久免费在线观看网站| 亚洲伊人久久大香线蕉在观| 国产亚洲成人久久| 亚洲中文字幕无码爆乳av中文| 亚洲国产一区明星换脸| 亚洲国产电影av在线网址| 成人伊人亚洲人综合网站222| 午夜亚洲国产成人不卡在线| 亚洲日韩中文字幕日韩在线| 中文字幕亚洲天堂| 日本亚洲成高清一区二区三区| 国产成人亚洲综合色影视| 亚洲电影一区二区三区| 久久久亚洲AV波多野结衣| 亚洲综合小说久久另类区 | 88av免费观看| 曰批全过程免费视频播放网站| 免费观看无遮挡www的视频| 97人伦色伦成人免费视频 | 国产偷伦视频免费观看| 日韩精品无码一区二区三区免费| 日韩内射激情视频在线播放免费 | 国产成人综合亚洲一区| xvideos永久免费入口| 大地影院MV在线观看视频免费 | 色偷偷亚洲男人天堂| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 妻子5免费完整高清电视| 免费视频淫片aa毛片| 亚洲乱码国产一区网址| 久久精品国产亚洲AV麻豆不卡 | 亚洲精品乱码久久久久久久久久久久 | 免费国产成人高清在线观看网站| 四虎影院免费在线播放| 亚洲人成色7777在线观看不卡| 亚洲AV无码成人精品区蜜桃| 91丁香亚洲综合社区| 免费无码又爽又黄又刺激网站 | 国产亚洲男人的天堂在线观看| 九九热久久免费视频| 波多野结衣免费在线观看|