咱们在打游击的时候,经常出现以下情况:自己在玩某种游戏快挂的时候,系统提示是否恢复到原来的状态进行重新开战。有人说这个是把这个类才有用原型模式克隆一个和原来一模一样的对象,把原来的数据信息保存起来,然后在恢复就OK了。错了,兄弟,这样会使得我们的对象的所有的方法暴露出来。在不破坏封装机构的前提下,我们如何用代码实现?
我们今天讲讲备忘录模式,解决刚才我们上段提到的问题。在不破坏封装的前提下,捕获一个对象内部状态,并在该对象外部保存状态;这样以后可将改对象恢复到原先保存的状态,这就是备忘录模式。采用这种设计模式,隐蔽了备份的细节;我们前台代码看不到实际的备份过程。当我们的备份内容发生改变的时候,我们只需修改备忘录类对象中的内容就可以了。其实咱们的很多设计模式都是尽量让前台的代码修改转到后台中去,减少前台发布的次数(若频繁发布,客户会对系统产生质疑、况且有些系统发布需要漫长的时间)。
具体的代码如下:
//发起类()
class Originator
{
//需保存的属性
private string state;
public string State
{
set{state=value;}
get{return state;}
}
//在没有破坏封装的基础下,实现类对象属性的数据的保存,并保存在外部环境中
public Memento createMemento()
{
return new Memento(state);
}
public void setMemento(Memento memento)
{
state=memento.state;
}
public void show()
{
Console.WriteLine("当前状态为:"+state);
}
}
//Memento类对需要备份的数据进行导入
class Memento
{
private string state;
//这个地方没有set,只能再构造函数中赋值
public string State
{
get{return state;}
}
public Memento(string state)
{
this.state=state;
}
}
//负责保管好备份的数据,但不能进行操作
class CareTaker
{
private Memento memento;
public Memento Memento
{
set{memento=value;}
get{return memento;}
}
}
//客户端
static void Main(string[] arg)
{
Originator o=new Originator();
o.state="100%";
//....
CareTaker c=new CareTaker();
c.Memento=o.createMemento();
//......
o.setMemento(s.Memento)
}
咱们在实际项目开发过程中,若遇到类似的情况;就直接按照以上方式进行套用就可以了。嘻嘻,主要还是得要大家理解它的做法。