设计模式----Memento(备忘录)模式

设计模式 ----Memento( 备忘录 ) 模式
 
GoF 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
 
Memento模式是用一个Memento对象来存储另外一个对象的内部状态(前提条件是不破坏封装),将一个对象的状态捕捉住,并外部化存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代器模式一同使用。
 
在Memento模式中三个角色都很关键:
Memento(备忘录):备忘录存储原发器的内部状态。原发器根据需要决定备忘录存储原发器的哪些内部状态;防止 原发器以外的其他对象访问备忘录。
Originator(原发器):创建一个备忘录,用以记录当前时刻他的内部状态;使用备忘录恢复内部状态。
Caretaker(负责人):负责保存好备忘录。不能对备忘录的内容进行操作或检查。
 
下面给出一个事例代码(来自《Java与模式》):
 
package  Memento;

public  class  Memento
{
    
private String state;
    
/** Creates a new instance of Memento */
    
public Memento(String state)
    
{
        
this.state = state;
    }
//end Memento(...)
    
    
public String getState()
    
{
        
return state;
    }
//end getState()
    
    
public void setState(String state)
    
{
        
this.state = state;
    }
//end setState(...)
    
}
// end class Memento

package  Memento;

public  class  Originator
{
    
private String state;
    
/** Creates a new instance of Originator */
    
public Originator() {
    }
//end Originator()
    
    
public Memento createMemento()
    
{
        
return new Memento(state);
    }
//end createMemento()
    
    
public void restoreMemento(Memento memento)
    
{
        state 
= memento.getState();
    }
//end restoreMemento(...)
    
    
public String getState()
    
{
        
return state;
    }
//end getState()
    
    
public void setState(String state)
    
{
        
this.state = state;
        System.out.println(
"Current state = " + this.state);
    }
//end setState(...)
    
}


package  Memento;

public  class  Caretaker
{
    
private Memento memento;
    
    
/** Creates a new instance of Caretaker */
    
public Caretaker() {
    }
//end Caretaker()
    
    
public Memento retrieveMemento()
    
{
        
return memento;
    }
//end retrieveMemento()
    
    
public void saveMemento(Memento memento)
    
{
        
this.memento = memento;
    }
//end saveMemento(...)
    
}
// end class Caretaker

看看怎么调用:
package  Memento;

public  class  MementoPattern
{
    
private static Originator ori = new Originator();
    
private static Caretaker car = new Caretaker();
    
    
/** Creates a new instance of MementoPattern */
    
public MementoPattern() {
    }
//end MementoPattern()
    
    
public void showMementoPattern()
    
{
        ori.setState(
"On");
        car.saveMemento(ori.createMemento());
        ori.setState(
"Off");
        ori.restoreMemento(car.retrieveMemento());
    }
//end showMementoPattern()
    
    
public static void main(String[] args)
    
{
        StringBuilder ssb 
= new StringBuilder();
        ssb.append(
"The Memento Pattern!");
        System.out.println(ssb.toString());
        MementoPattern mp 
= new MementoPattern();
        mp.showMementoPattern();
    }
//end main(...)
    
}
// end class MementoPattern
 
给出Memento模式的UML图:
小结:
Memento模式还是比较好理解的,在GoF的《设计模式》和《Java与模式》中都讲了比较详细的内容。特别是在《Java与模式》中讲了Memento模式的变种,目前只是学习了解起概念和具体应用就可以了。深入的内容等碰到合适的场景在去理解和运用。
 
 


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1007600
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值