备忘录模式

/**
 * 备忘录模式:也就是拥有反悔功能的模式:成员有3个
 * 发起者Originator:一切围绕它转,它拥有自己的状态,可以给状态记录备份和恢复状态
 * 备忘录Memento:记录发起者的状态,当发起者要恢复状态时,就调用它,前提是要先备份才能恢复
 * 备忘录管理者Caretaker:备忘录创建后,总要有个地方存吧,不然将来要恢复状态时,找不到对应的备份了
 *
 *
 */
//发起者
public class Originator {
    private String status;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Memento createMemento(){
        return new Memento(status);
    }

    public void restoreMemento(Memento memento){
        this.status=memento.getStatu();

    }
}
//备忘录
public class Memento{
    private String statu;

    public String getStatu() {
        return statu;
    }

    public Memento(String statu) {
        this.statu = statu;
    }

    public void setStatu(String statu) {
        this.statu = statu;
    }
}
//管理者,存储备忘录
public class Caretaker {
    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}
public class Test {
    public static void main(String[] args) {
        Originator originator = new Originator();
        originator.setStatus("init");//初始状态
        System.out.println("初始状态:"+originator.getStatus());
        Caretaker caretaker = new Caretaker();//管理者
        Memento memento = originator.createMemento();
        caretaker.setMemento(memento);//备份
        originator.setStatus("final");
        System.out.println("最终状态"+originator.getStatus());
        //恢复状态
        originator.restoreMemento(caretaker.getMemento());

        System.out.println("恢复后的状态:"+originator.getStatus());


    }
}
/**
 * 备忘录模式引用场景:手机删除了通讯录,然后通过云端备份还原,手机就是发起者(Originator),它拥有创建备份和恢复备份功能
 * 小米云就是备忘录(Memento),备忘录有多个联系人,此外还有一个管理者,管理备忘录(Caretaker)
 *
 *
 */

//手机(Originator)
public class RemiPhone {
    private List<LinkMan> list;

    public List<LinkMan> getList() {
        return list;
    }

    public void setList(List<LinkMan> list) {
        this.list = list;
    }
    //创建联系人备份
    public XiaoMiClound creatCloud(){
        return new XiaoMiClound(list);
    }
    //恢复联系人
    public void restoreLinkMan(XiaoMiClound clound){
        this.list=clound.getList();
    }
    //清空联系人
    public void clearAll(){
        list=new ArrayList<>();
    }
}
//小米云备份,备忘录角色(Memento)
public class XiaoMiClound {
    private List<LinkMan> list;

    public XiaoMiClound(List<LinkMan> list) {
        this.list = list;
    }

    public List<LinkMan> getList() {
        return list;
    }

    public void setList(List<LinkMan> list) {
        this.list = list;
    }
}
//备忘录管理者
public class LinkManCaretaker {
    private XiaoMiClound xiaoMiClound;

    public XiaoMiClound getXiaoMiClound() {
        return xiaoMiClound;
    }

    public void setXiaoMiClound(XiaoMiClound xiaoMiClound) {
        this.xiaoMiClound = xiaoMiClound;
    }
}
//联系人
public class LinkMan {
    private String name;
    private String phone;

    public LinkMan(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }

    public LinkMan() {
    }

    public String getName() {
        return name;
    }

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

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "LinkMan{" +
                "name='" + name + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }
}
public class Demo {
    public static void main(String[] args) {
        //创建联系人
        List<LinkMan> list=new ArrayList<>();
        list.add(new LinkMan("yangxiaohui","215555555"));
        list.add(new LinkMan("xiaoMing","322222"));
        list.add(new LinkMan("xiaohua","422256666"));
        list.add(new LinkMan("xiaohong","689999999"));
        //创建红米手机
        RemiPhone remiPhone = new RemiPhone();
        //存储联系人
        remiPhone.setList(list);

        XiaoMiClound xiaoMiClound = remiPhone.creatCloud();//创建云备份
        LinkManCaretaker linkManCaretaker = new LinkManCaretaker();
        linkManCaretaker.setXiaoMiClound(xiaoMiClound);//存储云备份

        //刷机,删除了联系人
        remiPhone.clearAll();

        System.out.println("还有"+remiPhone.getList().size()+"个联系人");//0

        //模拟云端恢复联系人

        remiPhone.restoreLinkMan(linkManCaretaker.getXiaoMiClound());

        System.out.println("还有"+remiPhone.getList().size()+"个联系人");//4


    }
}

 

posted @ 2019-05-28 17:40  yangxiaohui227  阅读(178)  评论(0)    收藏  举报