1、模板模式(Template Pattern)
1.1模板模式定义
模板模式:定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法模式可以使得子类不用改变一个算法的结构来重新定义该算法某些特定的步骤。我们可以简单理解为我们要按照设定好的步骤来完成某件事情,但是在其中某些步骤以因为对象的不同导致实现的细节也不相同,我们在父类中定义模板方法给出顶级逻辑框架,而逻辑的组成步骤在相应的抽象方法中,推迟到子类中去实现。
1.2模板模式结构图
1.3模板模式实例及代码
我们以平时生活中的游戏为例子。我们在玩游戏时都需要经过三个步骤:1、游戏初始化;2、玩游戏;3、游戏结束。这三个步骤就是算法的步骤,具体是哪个游戏初始化、玩和结束这是实现的细节,需要子类去实现。
public abstract class Game {
//这里将playGame方法定义为final是不允许让子类重写该方法
public final void playGame(){
//游戏初始化
this.initialize();
//开始游戏
this.startGame();
//游戏结束
this.endGame();
}
//定义抽象方法让子类去实现
protected abstract void initialize();
protected abstract void startGame();
protected abstract void endGame();
}
public class LoL extends Game {
@Override
protected void initialize() {
System.out.println("LoL 正在初始化游戏,请稍后");
}
@Override
protected void startGame() {
System.out.println("LoL 初始化完成,请稍开始游戏");
}
@Override
protected void endGame() {
System.out.println("LoL 结束");
}
}
1.4模板模式优缺点
-算法的行为由父类来控制,子类的实现不影响算法的整体结构
-封装了相同的代码,扩展可变的部分
2、备忘录模式(Memento Pattern)
2.1备忘录模式定义
备忘录模式:在不破坏封装的前提下,获取一个对象的内部状态并在该对象之外保存这个状态。这样以后就可以将该对象恢复到以前的状态。
2.2备忘录模式结构图
Originator是需要回到原先状态的对象,Memento是保存了Originator对象内部状态的类。Caretaker是用来保存备忘录,不能够对备忘录进行修改和检查。
2.3备忘录模式实例及代码
我们小时候在玩游戏时,常常会在打不过游戏的最终boss时会选择将游戏恢复到初始状态,在掌握游戏技巧后重新进行闯关。在恢复到初始状态时这就是一个备忘录模式的应用。
代码请参考我们github
2.4备忘录模式优缺点
-提供了一种恢复到历史状态的方法,用户不需要关心恢复的具体细节
-由于需要将对象的内部状态在对象之外保存,若需要回复的对象的成员变量过多时会造成系统资源的大量消耗
引用参考:
https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/simple_factory.html
程杰.大话设计模式[M].清华大学出版社
附:我的代码实现