设计模式之模板模式示例

10 篇文章 0 订阅
2 篇文章 0 订阅

模板模式

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());
	}
}

运行结果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值