模板模式
template pattern
模板,就是规定了一个算法
,然后把它拆成多个步骤
,其中一些步骤由子类来实现
。
由于模板实现了算法中的一些步骤,因此可以在保持变化同时,减少代码复制。
外部使用抽象的模板,而不是具体的子类,这体现了依赖倒置原则。
模板模式的核心类如下所示。
public abstract class Template {
public abstract ... operation1(...);
public final ... operation2(...){
....
}
public ... operation3(...){
....
}
}
模板可以定义三类方法:
(1)抽象方法:必须由子类实现。
(2)final 方法:不需要子类实现。
(3)Hook方法:可以使用默认实现,也可以被子类重写(如上的operation3())
算法可被定义在外部,外部使用Template(例如安卓Activity的生命周期)
或者算法被定义在Template内部。
示例
以HTTP后端接口
为例,演示模板模式是如何工作的。
下图是一个算法过程:
图中红色边框的处理过程是必须要由子类实现的,
而蓝色背景的处理过程是是固定的,也就是不需要子类实现。
代码如下:
/*模板类*/
public abstract class Lambda {
public boolean permit(String args) { //权限控制函数
return true;
}
public abstract void proceed(String args); //处理函数
public abstract Object result(); //返回处理结果
public Object error() {
return "403 permision denied";
}
public final String output(Object result) { //将结果输出为json
Gson gson = new Gson();
return gson.toJson(result);
}
}
/*实现模板的类*/
public class GetUserInfoLambda extends Lambda {
String result;
@Override
public void proceed(String args) {
//这里应该是复杂的过程,包括查询数据库啊之类
//但为了说明设计模式,特此简化
result = args + "的处理结果";
}
@Override
public Object result() {
return result;
}
@Override
public boolean permit(String args) {
if(args != null) {
return true;
}
return false;
}
}
/* 测试代码*/
public class Test {
public static void main(String[] args) {
//模拟两次调用
System.out.println(getUserInfo(null));
System.out.println(getUserInfo("123"));
}
/*算法或过程*/
public static String getUserInfo(String args) {
Lambda lambda = new GetUserInfoLambda();
if(!lambda.permit(args)) {
return lambda.output(lambda.error());
}
lambda.proceed(args);
return lambda.output(lambda.result());
}
}