备忘录模式-Memento

名称:

    备忘录模式(Memento Pattern)-对象行为模式

 

问题:

     The Memento pattern contains a snapshot of the state of an object, so that the object can return to its original state without having to reveal its content to the rest of the world

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

 

适用性

    -必须保存一个对象在某一时刻的状态,这样以后需要时它才能恢复到先前的状态。

    -如果一个用接口来让其他对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装型。

 

协作:

    -管理器向原发器请求一个备忘录,保留一段时间后,将其送回给原发器。

    -备忘录是被动的。只有创建备忘录的原发器会对他的状态进行赋值和检索。

    -定义窄接口和宽接口。

    -维护备忘录的潜在代价。

 

优点和缺点:

    -保持封装边界。

    -它简化了原发器。

    -使用备忘录可能代价很高。

解决方案:

    

1、 模式的参与者

    1、Memento 备忘录

    -备忘录存储原发器对象的内部状态。原发器根据需要决定备忘录存储原发器的那些内部状态。

    -防止原发器以外的其他对象访问备忘录。备忘录实际上有两个接口,管理者(Caretaker)只能看到备忘录的窄接口-它只能将备忘录传递给其他对象。相反,原发器能看到一个宽接口,允许它访问返回到先前状态所需的所有数据。理想的情况是只循序生成本备忘录的那个原发器访问本备忘录的内部状态。

    2、Originator 原发器

    -原发器创建一个备忘录,用以记录当前时刻它的内部状态。

    -使用备忘录恢复内部状态。

    3、Caretaker 负责人

    -负责保存好备忘录。

    -不能对备忘录的内容进行操作或检查。

 

2.实现方式

    

class Memento
{ 
    private String state; 
    public Memento(String state)
    { 
        this.state=state; 
    }     
    public void setState(String state)
    { 
        this.state=state; 
    }
    public String getState()
    { 
        return state; 
    }
}
class Originator
{ 
    private String state;     
    public void setState(String state)
    { 
        this.state=state; 
    }
    public String getState()
    { 
        return state; 
    }
    public Memento createMemento()
    { 
        return new Memento(state); 
    } 
    public void restoreMemento(Memento m)
    { 
        this.setState(m.getState()); 
    } 
}
class Caretaker
{ 
    private Memento memento;       
    public void setMemento(Memento m)
    { 
        memento=m; 
    }
    public Memento getMemento()
    { 
        return memento; 
    }
}
public class MementoPattern
{
    public static void main(String[] args)
    {
        Originator or=new Originator();
        Caretaker cr=new Caretaker();       
        or.setState("S0"); 
        System.out.println("state:"+or.getState());           
        cr.setMemento(or.createMemento());       
        or.setState("S1"); 
        System.out.println("new state:"+or.getState());        
        or.restoreMemento(cr.getMemento()); 
        System.out.println("restore state:"+or.getState());
    }
}

 

参考资料

《设计模式:可复用面向对象软件的基础》

 

posted @ 2020-07-01 17:46  diameter  阅读(123)  评论(0编辑  收藏  举报