备忘录模式(行为类)

来源:互联网 发布:剑网三咩太捏脸数据 编辑:程序博客网 时间:2024/06/08 09:25

UML

这里写图片描述

  • Originator角色: 1.创建一个含有当前的内部状态的备忘录对象。2.使用备忘录对象存储其内部状态
  • Mementor角色: 1.将发起人对象的内部状态存储起来。备忘录可以根据Originator对象的判断来决定存储多少Originator对象的内部状态
  • 负责人Caretaker角色: 1.负责保存备忘录对象。2.不检查备忘录对象的内容

介绍

意图: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在改对象之外保存这个状态。
优点: 1.提供了一个可以恢复状态的机制,可以使用户能够方便地回到某个历史的状态,2.实现了信息的封装,使得用户不需要状态保存的细节
缺点: 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存

例子

UML

这里写图片描述

代码

Boy(Originator)

public class Boy {    private String state = "" ;     public void changeState(String s){        this.state = s ;     }    public String getState(){        return this.state ;     }    public Mementor createMemento(){        return new Mementor(this.state) ;     }    public void restoreMemento(Mementor memento){        this.setState(memento.getState());    }    public void setState(String state){        this.state = state ;     }}

Mementor(mementor)

public class Mementor {    private String state  ;     public Mementor(String state) {        this.state = state ;     }    public String getState() {        return this.state;    }}

Caretaker(caretaker)

import java.util.ArrayList;import java.util.List;public class Caretaker {    private List<Mementor> memntors  = new ArrayList<Mementor>() ;     public Mementor  getMementor(int index){        if(index < memntors.size()){            return memntors.get(index) ;         }        return null ;     }    public void setMementor(Mementor memntor){        memntors.add(memntor) ;     }}

Client(client)

public class Client {    public static void main(String[] args) {        Boy boy = new Boy() ;         Caretaker caretaker = new Caretaker() ;         boy.changeState("今天心情很好");        System.out.println(boy.getState());        caretaker.setMementor(boy.createMemento());        boy.setState("今天心情很差");        System.out.println(boy.getState());        boy.restoreMemento(caretaker.getMementor(0));        System.out.println(boy.getState());    }}

结果

今天心情很好今天心情很差今天心情很好

参考

设计模式之禅
java与模式

0 0