模板模式
- 概述:定义一个操作中的算法的框架,而将一些步骤延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.模板模式是一种基于继承的代码复用技术.
- 帮助理解:模板模式可以理解为,有一个流程性的算法框架,现在将这个流程分解成一个个的步骤,其中有一些步骤是稳定不变的,有些是可能变化得,通过一个抽象类将所有的步骤抽象成一个个的方法.抽象类中有一个称之为”模板方法"的方法定义了这些步骤的执行次序.设计时根据具体的需求来决定那些是可以在抽象类中实现的(不会改变的步骤),哪些是可以在子类中实现的(可能会改变的步骤).这样的话,通过子类中对于一些可变的步骤中的不同实现可以使得相同的这个流程性算法框架有不同的执行结果.因为抽象类中定义了该算法框架的执行次序,所以说模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定的步骤.
- 包含的角色
- AbstractClass(抽象类):在这里定义了一系列基本操作,这些操作可以是具体的,也可以是抽象的.每一个基本操作都代表一个步骤.在子类中可以根据需求重写这些方法.同时,抽象类中定义了一个模板方法,用于规定这些步骤的执行次序.
- ConcreteClass(具体子类):抽象类的子类,实现抽象父类中的抽象方法.或者重写抽象父类已经实现的方法.
- 优点
- 封装不变的部分,扩展的是可变的部分
- 提取公共代码,便于维护.
- 行为有父类控制(因为抽象父类中有模板方法),由子类来负责一些具体的步骤实现
- 缺点
- 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大
代码实现
示例:十一快到了,博主想要在国庆节的时候出去玩,但是具体去哪里玩还没有确定,现在唯一可以确定的就是等待国庆节到来之前的日子要努力工作,好好学习.国庆节之后要回来继续上班,收收心.
抽象类
package TemplateMethod;
/**
* Created by looper on 2017/8/18.
*/
public abstract class SpendHoliday {
//放假之前的操作(步骤)
public void holidaybefore(){
System.out.println("辛勤工作,等待十月一国庆节的到来");
}
//放假时的操作(步骤)
public abstract void holiday();
public void holidayAfter(){
System.out.println("收收心,上班");
}
public void templateMethod(){
holidaybefore();
holiday();
holidayAfter();
}
}
具体实现子类1
package TemplateMethod;
/**
* Created by looper on 2017/8/18.
*/
public class PlayInShanghai extends SpendHoliday {
@Override
public void holiday() {
System.out.println("在上海胡吃海喝乱逛");
}
}
具体实现子类2
package TemplateMethod;
/**
* Created by looper on 2017/8/18.
*/
public class PlayInShuzhou extends SpendHoliday {
@Override
public void holiday() {
System.out.println("苏州园林走走停停,美景美不胜收");
}
}
测试类
package TemplateMethod;
/**
* Created by looper on 2017/8/18.
*/
public class TemplateTest {
public static void main(String[] args) {
//通过选择不同的子类来实现同一个算法框架不同的定义
//上海玩的实现子类
SpendHoliday spendHoliday = new PlayInShanghai();
spendHoliday.templateMethod();
System.out.println();
//苏州玩的实现子类
spendHoliday = new PlayInShuzhou();
spendHoliday.templateMethod();
}
}
我将23种设计模式的全部代码上传到CSDN,有用得到的同学 可以去下载.
下载地址 : 点我