您的位置:首页 > 编程语言 > Java开发

java设计模式(十八)--备忘录模式

2017-08-23 00:00 337 查看
对于备忘录模式,我解释完之后,大家一定会对这种模式感兴趣的,其实他就像我们玩的单机游戏一样,我们的游戏存档用的就是这种备忘录模式,我们每次进入游戏可以随便载入某一个存档,从这个存档所存储的状态开始进行游戏,让我们玩游戏时有后悔药所吃。

网络上的专业解释:

此模式保存一个对象的某个状态,以便在适当的时候恢复对象,他在不破坏封装性的前提下,获取对象的某些状态,并在这个对象之外保存这个对象。

实例:我们用备忘录模式完成对游戏人物的位置和等级的存储。

以下是我对此实例完成的类图:



以下是我对此实例完成的编码:

1.编写存档信息类,里面包括各个存档所包含的信息

public class Memento{
//位置
private String location;
private int lever;

public String getLocation() {
return location;
}
public int getLever() {
return lever;
}
public Memento(String location,int lever) {
this.location = location;
this.lever=lever;
}
}

2.编写存档类,其中提供方法实现对存档信息类中数据的显示(实现对存档信息的封装)

//一条存档
public class SaveFile{
//位置
private String location;
//等级
private int lever;
public void setLocation(String location) {
this.location = location;
}
public void setLever(int lever) {
this.lever = lever;
}
public String getLocation() {
return location;
}
public int getLever() {
return lever;
}
//将存档信息存储进一个存档
public Memento saveMemento(){
return new Memento(location,lever);
}
//获取存档信息的地址信息
public String getLocationFromMemento(Memento m){
return m.getLocation();
}
//获取存档信息的地址信息
public int getLeverFromMemento(Memento m){
return m.getLever();
}
}

3.编写存档的管理类(用于实现对存档的各种操作)

//游戏存档列表
public class MementoManager {
private static final List<Memento> lists=new ArrayList<>();
//添加存档进入存档列表
public void addInfo(Memento m){
lists.add(m);
}
//获取存档列表中的一条存档
public Memento get(int index){
return lists.get(index);
}
//获取存档列表的长度
public int len(){
return lists.size();
}
}

4.测试类(用于测试存档是否可以正常使用)

public class Test {
public static void main(String[] args) {
//新建一条存档对象
SaveFile sf=new SaveFile();
//新建一个存档列表
MementoManager mm=new MementoManager();
//将存档信息存储进如游戏
sf.setLever(1);
sf.setLocation("华山");
mm.addInfo(sf.saveMemento());
sf.setLever(10);
sf.setLocation("衡山");
mm.addInfo(sf.saveMemento());
sf.setLever(12);
sf.setLocation("泰山");
mm.addInfo(sf.saveMemento());
sf.setLever(20);
sf.setLocation("恒山");
mm.addInfo(sf.saveMemento());

System.out.println("=========模拟载入第一个存档============");
System.out.print("第一个存档:位置:"+sf.getLocationFromMemento(mm.get(0)));
System.out.println("\t\t等级:"+sf.getLeverFromMemento(mm.get(0)));

System.out.println("=========模拟载入第三个存档============");
System.out.print("第三个存档:位置:"+sf.getLocationFromMemento(mm.get(2)));
System.out.println("\t\t等级:"+sf.getLeverFromMemento(mm.get(2)));
}
}

5.后台输出

=========模拟载入第一个存档============
第一个存档:位置:华山		等级:1
=========模拟载入第三个存档============
第三个存档:位置:泰山		等级:12

通过我为大家编写的代码来看,对于我所做的存档信息类Memento来书,我没有动用他其中的任何方法,符合:迪米特原则(在最后给大家解释这个原则),而是在其他类中编写了访问这个类中方法的方法,这就是这个模式的优点:实现了对存档信息类的封装,使用户不会知道状态保存的细节。

还有一优点就是:这样的模式使用户可以恢复状态,就像一键还原一样,通过一个时间线索将某个软件返回到当时的各种状态。

当然,我们每次存储一次记录都会产生一文件,下一次通过载入这个文件来实现状态恢复,这样也就是说:我们每一次保存都会占用一定的内存,存储文件越多,浪费的资源也会相应增长,当然,这也与每次保存的数据的属性多少有关系。

迪米特原则:
又叫最少知识原则,顾名思义,就是知道的越少越好的意思,这是为啥呢?首先,如果两个类之间没有什么直接关系的话,那就让他们发生不了直接的相互作用,这样他们对对方就不了解了,但是,如果一个类要用到另一个类的方法的话要咋办呢?我们要通过第三个类来连接他们俩,这样如果这两个类的内容修改的话,那对这个系统造成的影响是最低的,如果每两个类之间都有着密切的关系,到了最后系统维护的时候那就都乱了。
我感觉他和”松耦合”是差不多的意思,都是为了实现代码的高复用性和高扩展性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: