设计模式——备忘录模式


作者:云都小生

推荐学习资源:史上最全的设计模式导学目录


概述



许多软件都提供了这样一种功能—— 撤销,这是我们一直在用,且非常重要的一个功能。在软件设计中,我们通常也会设计这样一种功能,而“撤回”功能的一种实现机制就是—— 备忘录模式

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

在备忘录模式中,通常有下面这些角色:原发者、备忘录、负责人。

原发者:我们会将那些需要进行备份、需要保存内部状态的类,设计成原发者,原发者能够创建备忘录。

备忘录:备忘录用于存放原发者的内部状态,备忘录对象一般只能由原发者和负责人类调用,不能被其他类访问、操作。

负责人:负责保存备忘录,不能对备忘录进行操作。一个负责人类能存储一个或多个备忘录对象。


单个备份的案例



单个备份是“只撤销一次”的意思,我们来看这个案例。

//原发者
public class Original 
{
    private String state;

    Original(String state)
    {
        this.state = state;
    }

    public Backup CreateBackup()
    {
        return new Backup(this);
    }

    public void RefBackup(Backup b)
    {
        state = b.state;
    }

    public void SetState(String state)
    {
        this.state = state;
    }

    public String GetState() 
    {
        return state;
    }
}

//备忘录
public class Backup {
    public String state; 

    Backup(Original o)
    {
        this.state = o.GetState();
    }

    public void SetState(String state)
    {
        this.state = state;
    }

    public String GetState()
    {
        return this.state;
    }
}


//负责人
public class BackupManager
{
    private Backup backup;

    public Backup GetBackup()
    {
        return backup;
    }

    public void SetBackup(Backup backup)
    {
        this.backup = backup;
    }
}

//测试类
public class Test 
{
    public static void main(String[] args) {
        Original original = new Original("版本1");

        Backup backup = original.CreateBackup();

        BackupManager manager = new BackupManager();
        manager.SetBackup(backup);


        original = new Original("版本2");
        original.RefBackup(manager.GetBackup());

        System.out.println(original.GetState());
    }
}

通常备忘录的设计都是跟原发类类似,因为它要保存原发类的状态(通常存放属性)。


多个备份的案例



有时候,我们只希望提供撤销一次的功能,但是有些时候,我们希望提供能够撤销好多次的功能,这个时候怎么办?

基本的设计框架没有什么变化,就是改两个地方。

//负责人
public class BackupManager {
    private ArrayList<Backup> backupList = new ArrayList();  

    public Backup GetBackup(int i) {  
        return (Backup)backupList.get(i);  
    }  

    public void AddBackup(Backup backup) {  
        backupList.add(backup);  
    }
}

负责人是负责存储备忘录,我们可以在这个地方,用集合来存放。

public class Test {
    public static void main(String[] args) {
        Original original = new Original("版本1");

        Backup backup = original.CreateBackup();

        BackupManager manager = new BackupManager();
        manager.AddBackup(backup);


        original = new Original("版本2");
        original.RefBackup(manager.GetBackup(0));

        System.out.println(original.GetState());
    }
}

在客户端也要进行相应的修改。


总结



备忘录模式可以实现“撤回”的这种功能,但是缺点在于,这样很消耗资源。

2018/2/27 16:28:14 @Author:云都小生

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值