什么是模板方法
模板方法模式是一个类的行为模式。定义一个操作流程的模板方法,然后声明部分抽象方法,迫使子类实现 并完善其业务逻辑,不同的子类有不同的实现 从而子类完善的业务逻辑也不一样。
模板方法模式的结构
AbstractClass: 抽象模板(Abstract Template)角色有如下责任
- 定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤
- 定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。
ConcreteClass:具体模板(Concrete Template)角色有如下责任:
- 实现父类定义的抽象方法,它们是一个顶级逻辑的组成步骤。
- 每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。
举个例子:比如支付功能,有支付宝支付,微信支付。就可以定义一个支付的模板抽象类,定义一个支付的实现方法,再声明支付方式的抽象类。
模板抽象类,定义pay(monry)具体实现方法,声明callPay(money) 抽象方法,由子类实现
package com.template;
public abstract class AbstractPay {
/**
* 定义支付的实现方法
* @param money 金额
* @return
*/
protected boolean pay(double money) {
return callPay(money); // 调用字类的实现方法
}
/**
* 声明抽象的支付方式
* @param money
* @return
*/
protected abstract boolean callPay(double money);
}
支付宝支付继承类,实现callPay(money)抽象方法,说明支付不能小于20元
package com.template.concrete;
import com.template.AbstractPay;
public class AliPay extends AbstractPay {
protected boolean callPay(double money) {
System.out.println("支付宝支付");
if (money < 20.0D) {
System.out.println("小于最小支付");
}
return true;
}
}
微信支付继承类,实现callPay(money)抽象方法,说明支付不能大于20元
package com.template.concrete;
import com.template.AbstractPay;
public class WeChatPay extends AbstractPay {
protected boolean callPay(double money) {
System.out.println("微信支付");
if (money > 20.0D) {
System.out.println("超出最大支付了");
}
return true;
}
}
再写一个静态工厂模式创建对象
package com.template.factory;
import com.template.AbstractPay;
import com.template.concrete.AliPay;
import com.template.concrete.WeChatPay;
public class PayFactory {
public static AbstractPay getAbstractPay(String payCode) {
switch (payCode) {
case "ali_pay":
return new AliPay();
case "weChat_pay":
return new WeChatPay();
default:
return null;
}
}
}
优点:
模板方法模式是通过把不变的行为挪到一个统一的父类,从而达到去除子类中重复代码的目的、子类实现模板父类的某些细节,有助于模板父类的扩展,通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开闭原则”。
缺点
子类执行的结果影响了父类的结果,会增加代码阅读的难度。
使用场景
多个功能有共同的行为操作。