为了账号安全,请及时绑定邮箱和手机立即绑定

【设计模式】备忘录模式

标签:
Java

备忘录模式(Memonto Pattern)


在不被破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。


优点:实现新的封装和提供了状态恢复的实现机制


缺点:资源消耗过大


模式结构:
图片描述


1.Originator(原发器)
保存内部状态的类称为原发器。原发器可以创建一个备忘录,并存储它的当前状态,也可以使用备忘录来恢复其内部状态。

2.Memonto(备忘录)
备忘录对象不能直接被其他类使用,根据原发器来决定保存哪些内部状态。

3.Caretaker(负责人)
负责人又称管理者,它负责保存备忘录,但不能对备忘录的内容进行检查或者操作。它可以保存一个或者多个备忘录对象。


例子 恢复用户信息


1.原发器 UserInfoOriginator

package memento_22_1;
/**
 * 用户信息类(原发器)
 */
public class UserInfoOriginator
{
    //用户名
    private String username;
    //密码
    private String password;
    //电话号码
    private String phoneNumber;

    public String getUsername()
    {
        return username;
    }
    public void setUsername(String username)
    {
        this.username = username;
    }
    public String getPassword()
    {
        return password;
    }
    public void setPassword(String password)
    {
        this.password = password;
    }
    public String getPhoneNumber()
    {
        return phoneNumber;
    }
    public void setPhoneNumber(String phoneNumber)
    {
        this.phoneNumber = phoneNumber;
    }
    /**
     * 保存备忘录
     * @return 返回一个新的备忘录对象
     */
    public Memento saveMemento()
    {
        return new Memento(username, password, phoneNumber);
    }

    /**
     * 恢复备忘录对象
     * @param memento
     */
    public void restoreMemento(Memento memento)
    {
        this.username = memento.getUsername();
        this.password = memento.getPassword();
        this.phoneNumber = memento.getPhoneNumber();
    }
    /**
     * 显示用户信息
     */
    public void show()
    {
        System.out.println("username:" + username);
        System.out.println("password:" + password);
        System.out.println("phoneNumber:" + phoneNumber);
    }
}

2.备忘录

package memento_22_1;
/**
 * 备忘录
 */
public class Memento
{
    //用户名
    private String username;
    //密码
    private String password;
    //电话号码
    private String phoneNumber;
    public Memento()
    {
    }
    public Memento(String username, String password, String phoneNumber)
    {
        this.username = username;
        this.password = password;
        this.phoneNumber = phoneNumber;
    }
    public String getUsername()
    {
        return username;
    }
    public void setUsername(String username)
    {
        this.username = username;
    }
    public String getPassword()
    {
        return password;
    }
    public void setPassword(String password)
    {
        this.password = password;
    }
    public String getPhoneNumber()
    {
        return phoneNumber;
    }
    public void setPhoneNumber(String phoneNumber)
    {
        this.phoneNumber = phoneNumber;
    }

}

3.负责人

package memento_22_1;
/**
 * 负责人
 */
public class Caretaker
{
    private Memento memento;

    public Memento getMemento()
    {
        return memento;
    }

    public void setMemento(Memento memento)
    {
        this.memento = memento;
    }

}

4.测试类(初始状态--->修改状态--->恢复状态)

package memento_22_1;
/**
 * 测试类
 */
public class Test
{

    public static void main(String[] args)
    {
        //创建原发器
        UserInfoOriginator originator = new UserInfoOriginator();
        //创建负责人
        Caretaker taker = new Caretaker();

        originator.setUsername("张三");
        originator.setPassword("123456");
        originator.setPhoneNumber("13800138000");
        show(originator, "初始状态");
        //保存状态
        taker.setMemento(originator.saveMemento());
        //修改密码和电话号码
        originator.setPassword("654321");
        originator.setPhoneNumber("1323270755x");
        show(originator, "修改状态");

        //恢复状态一
        originator.restoreMemento(taker.getMemento());
        show(originator, "恢复到初始状态");

    }
    private static void show(UserInfoOriginator originator,String status)
    {
        System.out.println(status + ":");
        originator.show();
        System.out.println("-----------------------");

    }

}

运行结果
图片描述


代码: http://114.215.186.20/14551100130/designPattern/memento_22_1.rar


点击查看更多内容
3人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消