模板方法模式
-
- 一、模板方法模式的概念和角色
- 二、模板方法模式的应用场景
- 三、 模板方法模式的代码示例
- 四、模板方法模式重构JDBC操作业务
- 五、模板方法模式的优缺点
- 六、设计模式的相关博客文章链接
-
- 1、七大设计原则的简单解释(包含合成复用原则),简单理解、快速入门,具备案例代码
- 2、工厂模式详解附有代码案例分析(简单工厂,工厂方法,抽象工厂)
- 3、单例模式详解及代码案例与应用场景(饿汉式单例模式、懒汉式单例模式、注册式单例模式)
- 4、原型模式详解附有代码案例分析(浅克隆和深克隆的相关解析)
- 5、建造者模式详解附有代码案例分析(包含建造者模式与工厂模式的区别分析)
- 6、门面模式详解附有代码案例分析
- 7、装饰者模式详解附有代码案例分析
- 8、享元模式详解附有代码案例分析(包含享元模式的源码应用分析——String中的享元模式应用、Integer中的享元模式应用)
- 9、组合模式详解附有代码案例分析(包含透明组合模式、安全组合模式的代码示例)
- 10、桥接模式详解附有代码案例分析
- 11、适配器模式详解附有代码案例分析(包含类适配器、对象适配器以及接口适配器的代码示例)
- 12、委派模式详解附有代码案例分析(包含委派模式在JDK中的源码示例解析)
- 13、模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例)
- 14、策略模式详解附有代码案例分析(包含策略模式在源码中的应用以及代码示例)
- 15、责任链模式详解附有代码案例分析(包含责任链模式与建造者模式的结合代码案例)
- 16、迭代器模式详解附有代码案例分析(包含迭代器模式的源码应用分析)
- 17、命令模式详解附有代码案例分析(包含命令模式的源码应用分析)
- 18、状态模式详解附有代码案例分析(包含状态模式与其他相关设计模式的对比)
- 19、备忘录模式详解附有代码案例分析
- 20、中介者模式详解附有代码案例分析
- 21、解释器模式详解附有代码案例分析
- 22、观察者模式详解附有代码案例分析(包含观察者模式使用JDK方式实现)
- 23、访问者模式详解附有代码案例分析
一、模板方法模式的概念和角色
(一)、模板方法模式的概念
模板方法模式是指定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,属于行为型设计模式。
模板方法模式实际上是封装了一个固定流程,该流程由几个步骤组成,具体步骤可以由子类进行不同实现,从而让固定的流程产生不同的结果。模板方法模式非常简单,就是类的继承机制。但是它确实一个应用非常广泛的模式。模板方法模式的本质是抽象封装流程,具体进行实现。
(二)、模板方法模式的角色
抽象模板(AbstractClass):抽象模板类,定义了一套算法框架/流程
具体实现(ConcreteClass):具体实现类,对算法框架/流程的某些步骤进行了实现。
二、模板方法模式的应用场景
1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
2、各子类中公共的行为被提取除了并集中在一个公共的父类中,从而避免代码重复。
三、 模板方法模式的代码示例
该示例中出现的钩子方法的主要目的是用来干预执行流程,使得我们控制行为更加灵活,更加符合实际业务的需求。
钩子方法的返回值一般为适合条件分支语句的返回值(boolean,int等)
AbstractCook:
public abstract class AbstractCook {
public final void create() {
cutUpVegetables();
stirFry();
eat();
if (needWashDishes()) {
washDishes();
}
}
protected void cutUpVegetables() {
System.out.println("切菜");
}
protected void stirFry() {
System.out.println("炒菜");
}
protected void eat() {
System.out.println("吃");
}
// 钩子方法
protected boolean needWashDishes() {
return false;
}
protected abstract void washDishes();
}
ACook:
public class ACook extends AbstractCook {
private boolean needWashDishes = false;
public void setNeedWash(boolean needWashDishes) {
this.needWashDishes = needWashDishes;
}
@Override
protected boolean needWashDishes() {
return this.needWashDishes;
}
@Override
protected void washDishes() {
System.out.println("A洗碗");
}
}
BCook:
public class BCook extends AbstractCook {
@Override
protected void washDishes