23种设计模式总览
创建型模式
结构型模式
- 外观模式(Facade)
- 适配器模式(Adapter)
- 代理模式(Proxy)
- 组合模式(Composite)
- 享元模式(Flyweight)
- 装饰模式(Decorator)
- 桥接模式(Bridge)
行为型模式
- 中介者模式(Mediator)
- 观察者模式(Observer)
- 命令模式(Command)
- 迭代器模式(Iterator)
- 模板方法模式(Template Method)
- 策略模式(Strategy)
- 状态模式(State)
- 备忘录模式(Memento)
- 解释器模式(Interpreter)
- 职责链模式(Chain of Responsibility)
- 访问者模式(Visitor)
定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
优缺点
优点: 1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点: 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
使用场景:
1、需要保存/恢复数据的相关状态场景。 2、提供一个可回滚的操作。
实现
备忘录模式使用三个类 Memento、Originator 和 CareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。
MementoPatternDemo,我们的演示类使用 CareTaker 和 Originator 对象来显示对象的状态恢复。
步骤 1
创建 Memento 类。
//备忘录角色(Memonto)
public class Memento {
private String state;
public Memento(String state){
this.state = state;
}
public String getState(){
return state;
}
}
步骤 2
创建 Originator 类。
//发起人角色(Originator)
public class Originator {
private String state;
public void setState(String state){
this.state = state;
}
public String getState(){
return state;
}
//保存状态到备忘录
public Memento saveStateToMemento(){
return new Memento(state);
}
//备忘录中得到状态
public void getStateFromMemento(Memento Memento){
state = Memento.getState();
}
}
步骤 3
创建 CareTaker 类。
//负责人角色(Caretaker)
public class CareTaker {
private List<Memento> mementoList = new ArrayList<Memento>();
public void add(Memento state) {
mementoList.add(state);
}
public Memento get(int index) {
return mementoList.get(index);
}
}
步骤 4
使用 CareTaker 和 Originator 对象。
public class MementoPatternDemo {
public static void main(String[] args) {
//发起人角色(Originator)
Originator originator = new Originator();
//负责人角色(Caretaker)
CareTaker careTaker = new CareTaker();
originator.setState("State #1");
originator.setState("State #2");
//保存状态到备忘录
careTaker.add(originator.saveStateToMemento());
originator.setState("State #3");
//保存状态到备忘录
careTaker.add(originator.saveStateToMemento());
originator.setState("State #4");
System.out.println("Current State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(0));
System.out.println("First saved State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(1));
System.out.println("Second saved State: " + originator.getState());
}
}
步骤 5
验证输出。
Current State: State #4
First saved State: State #2
Second saved State: State #3