设计模式简介
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。
备忘录模式
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。
优点:
- 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
- 实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点: 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
使用场景:
- 需要保存/恢复数据的相关状态场景。
- 提供一个可回滚的操作。
注意事项:
- 为了符合迪米特原则,还要增加一个管理备忘录的类。
- 为了节约内存,可使用原型模式+备忘录模式。
实现
新建一个类,所有状态都再这个类中恢复
public class Storage {
List<Object> list = new ArrayList<>();
public void putIn(Object object) {
list.add(object);
}
public Object getOut(int index) {
return list.get(index);
}
}
一个需要保存状态的类
public class User {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public StatusInfo saveStatus() {
return new StatusInfo().setStatus(name);
}
public void getStatus(StatusInfo statusInfo) {
setName(statusInfo.getStatus());
}
}
用来保存状态的类
public class StatusInfo {
public String status;
public String getStatus() {
return status;
}
public StatusInfo setStatus(String status) {
this.status = status;
return this;
}
}
运行
public static void main(String[] args) throws CloneNotSupportedException {
User user = new User();
Storage storage = new Storage();
user.setName("第一");
user.setName("第二");
storage.putIn(user.saveStatus());
user.setName("第三");
storage.putIn(user.saveStatus());
user.setName("第四");
System.out.println(user.getName());
user.getStatus((StatusInfo)storage.getOut(0));
System.out.println(user.getName());
user.getStatus((StatusInfo)storage.getOut(1));
System.out.println(user.getName());
}
结果
第四
第二
第三