1. 模板方法模式
模板方法模式,点睛之笔在“模板”二字,模板是什么,它是一个标准的,固定的流程。抽象模板定义出流程,子类实现具体的流程步骤,由此实现“千人千面”的效果。
2. 模板方法模式优缺点
2.1 优点
- 封装了不变部分,可变部分由子类扩展。
- 公共代码提取到父类中,提高了代码的复用性。
- 子类扩展父类,符合开闭原则。
2.2 缺点
- 模板不能变,模板一旦增加了抽象方法,所有的子类都要跟着变。
3. 模板方法模式举例
3.1 举例说明及类图
用服务调用举个例子。
服务调用一共可以分三步,第一步,验证入参;第二步,调用服务;第三步,组装结果。整个调用过程是一个标准处理流程,我们可以用模板方法模式抽象出这个流程,让不同的接口实现具体的流程步骤。
3.2 代码实现
从类图上可以看出,模板方法模式主要分为两部分,第一部分是抽象的模板,第二部分是具体的模板实现。我们通过代码模拟一下。
第一部分,定义出抽象模板:
public abstract class ServiceTemplate {
protected abstract boolean checkPara(Object request);
protected abstract Object callService(Object request);
protected abstract Object assemblyResult(Object response);
public Object doService(Object request) {
if(checkPara(request)) {
Object response = callService(request);
return assemblyResult(response);
} else {
return Boolean.FALSE;
}
}
}
第二部分,定义出具体业务服务A:
public class ServiceA extends ServiceTemplate{
@Override
protected boolean checkPara(Object request) {
System.out.println("check para in service A");
return Boolean.TRUE;
}
@Override
protected Object callService(Object request) {
System.out.println("call service in service A");
return null;
}
@Override
protected Object assemblyResult(Object response) {
System.out.println("assembly result in service A");
return "service A done";
}
}
定义出具体业务服务B:
public class ServiceB extends ServiceTemplate{
@Override
protected boolean checkPara(Object request) {
System.out.println("check para in service B");
return Boolean.TRUE;
}
@Override
protected Object callService(Object request) {
System.out.println("call service in service B");
return null;
}
@Override
protected Object assemblyResult(Object response) {
System.out.println("assembly result in service B");
return "service B done";
}
}
MainClass 调用下:
public class Main {
public static void main(String[] args) {
Object request = new Object();
ServiceTemplate templateA = new ServiceA();
templateA.doService(request);
System.out.println("================================");
ServiceTemplate templateB = new ServiceB();
templateB.doService(request);
}
}
调用结果如下: