← 返回首页
设计模式基础教程(二十八)
发表时间:2021-08-30 16:52:15
备忘录模式

1.备忘录模式

备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。它是一种对象行为型模式,其别名为Token。

备忘录模式是一种给我们的软件提供后悔药的机制,通过它可以使系统恢复到某一特定的历史状态。

备忘录模式包含如下角色: - Originator: 原发器 - Memento: 备忘录 - Caretaker: 负责人

2.实例

某系统提供了用户信息操作模块,用户可以修改自己的各项信息。为了使操作过程更加人性化,现使用备忘录模式对系统进行改进,使得用户在进行了错误操作之后可以恢复到操作之前的状态。

项目结构图如下:

设计备忘录状态类

public class MemenTo {
    private String account;
    private String password;
    private String telNo;

    public MemenTo(String account, String password, String telNo) {
        super();
        this.account = account;
        this.password = password;
        this.telNo = telNo;
    }
    public String getAccount() {
        return account;
    }
    public void setAccount(String account) {
        this.account = account;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getTelNo() {
        return telNo;
    }
    public void setTelNo(String telNo) {
        this.telNo = telNo;
    }

    public void show(){
        System.out.println("account:"+this.account);
        System.out.println("password:"+this.password);
        System.out.println("telNo:"+this.telNo);
    }
}

设计用户状态操作类

public class UserInfoDTO {
    private MemenTo memen;
    public UserInfoDTO(MemenTo memen){
        this.memen = memen;
    }

    public String getAccount() {
        return memen.getAccount();
    }
    public void setAccount(String account) {
        this.memen.setAccount(account);
    }
    public String getPassword() {
        return this.memen.getPassword();
    }
    public void setPassword(String password) {
        this.memen.setPassword(password);
    }
    public String getTelNo() {
        return memen.getTelNo();
    }
    public void setTelNo(String telNo) {
        this.memen.setTelNo(telNo);
    }

    public MemenTo saveMemenTo(){
        return new MemenTo(memen.getAccount(),memen.getPassword(), memen.getTelNo());
    }

    public void restoreMemenTo(MemenTo memenTo){
        this.memen = memenTo;
    }

    public void show(){
        this.memen.show();
    }
}

设计负责人类

public class CareTaker {

    private MemenTo memenTo;
    public MemenTo getMemenTo() {
        return memenTo;
    }
    public void setMemenTo(MemenTo memenTo) {
        this.memenTo = memenTo;
    }
}

测试类

public class MemenToDemo01 {

    public static void main(String[] args) {
        MemenTo memenTo = new MemenTo("zhangsan","123456","18991167133");
        UserInfoDTO userInfoDTO=new UserInfoDTO(memenTo);
        CareTaker careTaker=new CareTaker();

        System.out.println("状态一....");
        userInfoDTO.show();
        //保存备忘录
        careTaker.setMemenTo(userInfoDTO.saveMemenTo());
        System.out.println("-------------");

        userInfoDTO.setPassword("1111111");
        userInfoDTO.setTelNo("13991837899");
        System.out.println("状态二....");
        userInfoDTO.show();
        System.out.println("----------------");

        //从备忘录中恢复
        userInfoDTO.restoreMemenTo(careTaker.getMemenTo());
        System.out.println("回到状态一....");
        userInfoDTO.show();
        System.out.println("-------------------");
    }
}

运行结果:
状态一....
account:zhangsan
password:123456
telNo:18991167133
-------------
状态二....
account:zhangsan
password:1111111
telNo:13991837899
----------------
回到状态一....
account:zhangsan
password:123456
telNo:18991167133
-------------------