参考文章:
《设计模式》
《设计模式知识体系详解》
《DesignPatterns》
写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。
前言
行为型模式是将不同的行为代码解耦,从而解决特定场景问题的一些经典结构。行为型设计模式主要解决的就是“类或对象之间的交互”问题。行为型设计模式比较多,有 11 个,几乎占了 23 种经典设计模式的一半。它们分别是:观察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式。
一、模板模式
简介
只定义一个方法过程中的主要过程,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,这就是模板模式。
样例
基于同一个父类的两个实现类有类似的流程,但是某些步骤会有点不一样,使用模板模式可以复用那些相同步骤的代码。
比如冲咖啡和冲茶都有类似的流程,但是某些步骤会有点不一样,我们就可以在。
首先定义父类中方法的基本过程,并将其中一些步骤的具体实现留给子类去完成。
public abstract class CaffeineBeverage {
// 父类中定义操作的基本过程
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
// 某些步骤的具体实现留给子类
abstract void brew();
abstract void addCondiments();
void boilWater() {
System.out.println("boilWater");
}
void pourInCup() {
System.out.println("pourInCup");
}
}
不同的子类可以根据具体的行为实现父类实现方法。
public class Coffee extends CaffeineBeverage {
@Override
void brew() {
System.out.println("Coffee.brew");
}
@Override
void addCondiments() {
System.out.println("Coffee.addCondiments");
}
}
public class Tea extends CaffeineBeverage {
@Override
void brew() {
System.out.println("Tea.brew");
}
@Override
void addCondiments() {
System.out.println("Tea.addCondiments");
}
}
当使用子类调用公共方法时就可以实现出不同的效果。
public class Client {
public static void main(String[] args) {
CaffeineBeverage caffeineBeverage = new Coffee();
caffeineBeverage.prepareRecipe();
System.out.println("-----------");
caffeineBeverage = new Tea();
caffeineBeverage.prepareRecipe();
}
}
boilWater
Coffee.brew
pourInCup
Coffee.addCondiments
-----------
boilWater
Tea.brew
pourInCup
Tea.addCondiments
总结
模板模式将通用的逻辑封装在父类中,将子类中不同的部分在父类中定义为一个抽象方法或者虚方法(具体根据实际场景选择),然后在子类中继承父类以复用父类中的通用逻辑,在具体的子类中实现需要重写的逻辑,这样就实现了多态的效果。
模板模式有两大作用:复用和扩展。其中,复用指的是,所有的子类可以复用父类中提供的模板方法的代码。扩展指的是,子类通过模板模式提供功能扩展点,让我们可以在不修改父类源码的情况下,基于扩展点定制化子类的功能。