设计模式之备忘录

备忘录模式在生活中还是挺常见的一种功能,像编辑器的恢复之前操作,浏览器中的后退以及玩游戏中的悔棋都属于较为常见的一种。

备忘录模式(Memento)的结构

暂时略过:

代码示例(黑箱实现):(大致原理:游戏发起人内部定义Memo对象 对外实现IMemo接口,并保存在Caretker对象里,等Originator经过一系列操作如fight,后想要恢复则调用内部recover接口,参数则是之前保存在Caretker对象里的IMemo对象 从而实现黑箱备忘录实现, 这样对发起人实现了宽接口, 对外实现了窄接口)

备忘录有两个等效的接口:
窄接口:管理者对象(和其他发起人对象之外的任何对象)看到的是备忘录的窄接口,这个窄接口只允许他把备忘录对象传给其他的对象。
宽接口:与管理者看到的窄接口相反,发起人对象可以看到一个宽接口,这个宽接口允许它读取所有的数据,以便根据这些数据恢复这个发起人对象的内部状态。

package com.mp.mng.platform.memo;

/**
 * 备忘录接口(用接口实现, 对外提供窄接口)
 */
public interface IMemo {
}
package com.mp.mng.platform.memo;

/**
 * 发起人
 */

public class Originator {


    private int stat;//状态
    private int vit;//防御力
    private int agv;//攻击力


    public void initS() {
        stat = 100;
        vit = 100;
        agv = 100;
    }


    public void fight() {
        stat = 0;
        vit = 0;

        agv = 0;
    }

    public IMemo saveS() {
       return  new RoleStateMemo(stat, vit, agv);

    }

    public void showStatus() {
        System.out.println("stat:" + stat);
        System.out.println("vit:" + vit);
        System.out.println("agv:" + agv);
    }

    public void recoverS(IMemo memo) {
        RoleStateMemo roleStateMemo = (RoleStateMemo) memo;
        stat = ((RoleStateMemo) memo).getStat();
        vit = ((RoleStateMemo) memo).getVit();
        agv = ((RoleStateMemo) memo).getAgv();

    }


    private class RoleStateMemo implements  IMemo {
        private int stat;//状态
        private int vit;//防御力
        private int agv;//攻击力

        public RoleStateMemo() {

        }

        public int getStat() {
            return stat;
        }

        public void setStat(int stat) {
            this.stat = stat;
        }

        public int getVit() {
            return vit;
        }

        public void setVit(int vit) {
            this.vit = vit;
        }

        public int getAgv() {
            return agv;
        }

        public void setAgv(int agv) {
            this.agv = agv;
        }

        public RoleStateMemo(int stat, int vit, int agv) {
            this.stat = stat;
            this.vit = vit;
            this.agv = agv;
        }
    }



}
package com.mp.mng.platform.memo;

/**
 * 备忘录管理对象
 */
public class Caretaker {

    private IMemo memo;


    public IMemo getMemo() {
        return memo;
    }

    public void setMemo(IMemo memo) {
        this.memo = memo;
    }
}
package com.mp.mng.platform.memo;

public class Client {

    public static void main(String[] args) {
        Originator originator = new Originator();
        System.out.println("===========start=============");
        originator.initS();
        originator.showStatus();
        Caretaker caretaker = new Caretaker();
        caretaker.setMemo(originator.saveS());
        System.out.println("===========end=============");

        originator.fight();
        originator.showStatus();
        System.out.println("===========recover=============");


        originator.recoverS(caretaker.getMemo());
        originator.showStatus();




    }
}

执行结果如下:

 


版权声明:本文为maguoliang110原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。