@TOC一、模板方法模式定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
通用类图
模板方法模式使用了Java的继承机制。其中,AbstractClass叫做抽象模板,它的方法分为两类:
基本方法:
基本方法也叫作基本操作,是由子类实现的方法,并且在模板方法被调用。
模板方法:
可以是一个或多个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。
代码如下:
/**
* 抽象模板
*/
public abstract class AbstractClass {
/**
* 基本方法
*/
protected abstract void doSomething();
/**
* 基本方法
*/
protected abstract void doAnything();
/**
* 模板方法
*/
public final void templateMethod() {
//调用基本方法,完成相关逻辑
System.out.println("模板方法-做一些事情");
doSomething();
doAnything();
}
}
/**
* 具体模板类
*/
public class ConcreteClass1 extends AbstractClass {
@Override
protected void doSomething() {
//实现基本方法,进行业务处理
System.out.println("ConcreteClass1-doSomething");
}
@Override
protected void doAnything() {
//实现基本方法,进行业务处理
System.out.println("ConcreteClass1-doAnything");
}
}
/**
* 具体模板类
*/
public class ConcreteClass2 extends AbstractClass {
@Override
protected void doSomething() {
//实现基本方法,业务处理逻辑
System.out.println("ConcreteClass2-doSomething");
}
@Override
protected void doAnything() {
//实现基本方法,业务处理逻辑
System.out.println("ConcreteClass2-doAnything");
}
}
public class Client {
public static void main(String[] args) {
AbstractClass concreteClass1 = new ConcreteClass1();
//调用模板方法
concreteClass1.templateMethod();
AbstractClass concreteClass2 = new ConcreteClass2();
concreteClass2.templateMethod();
}
}
去银行办理业务,一般流程式
1、先取号
2、办理具体业务(不固定,取钱 存钱)
3、评价
其中第二部是不固定的,具体业务不一样,有存钱的有取钱的等
/**
* 去银行办理业务
* 1、先取号
* 2、办理具体业务(不固定,取钱 存钱)
* 3、评价
*/
public abstract class AbstractBankTemplate {
/**
* 取号
*/
private void takeNumber(){
System.out.println("排队取号");
}
/***
* 办理具体业务
*/
protected abstract void doProfessionalWork();
/**
* 评价
*/
private void evaluate(){
System.out.println("评价");
}
/**
* 定义流程
*/
public final void process() {
//1、先取号
this.takeNumber();
//2、办理具体业务
doProfessionalWork();
//3、评价
this.evaluate();
}
}
/**
* 存钱
*/
public class Deposit extends AbstractBankTemplate {
@Override
protected void doProfessionalWork() {
System.out.println("存它个一百万");
}
}
/**
* 取钱
*/
public class Withdraw extends AbstractBankTemplate {
@Override
protected void doProfessionalWork() {
System.out.println("取1个亿");
}
}
public class Client {
public static void main(String[] args) {
AbstractBankTemplate deposit = new Deposit();
deposit.doProfessionalWork();
AbstractBankTemplate withdraw = new Withdraw();
withdraw.doProfessionalWork();
}
}
@TOC二、模板方法模式的应用场景
1.多个子类有共有的方法,并且逻辑基本相同时。
2.重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则又各个子类实现。
@TOC三、模板方法模式的优点
封装不变的部分,扩展可变的部分
把认为不变的部分的算法封装到父类实现,而可变部分的则可以通过继承来继续扩展
提取公共部分代码,便于维护
行为由父类控制,子类实现
@TOC**
按照我们的设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类完成具体的事物属性和方法。但模板方法却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行的结果影响了父类的结果,也就是子类对父类产生了影响,这在复杂的项目中,会带来代码阅读的难度
@TOC五、实际应用例子
HttpServlet担任抽象模板角色
模板方法:由service()方法担任。
基本方法:由doPost()、doGet()等方法担任。
TestServlet担任具体模板角色
TestServlet置换掉了父类HttpServlet中七个基本方法中的其中两个,分别是doGet()和doPost()。