设计模式之模板方法模式(Template Method)

            本来打算按照书上的讲的设计模式一个一个学下来,但是读spring源码的时候遇到模板方法模式,不懂,就提前先学一下。

模板方法模式就是定义一个算法执行的骨架,而具体的算法被延迟到子类中去实现,在spring中很多地方都使用到了模板方法模式,比如spring的JdbcTemplate,spring的HibernateTemplate中都是用了模板方法模式。

我们来看一个例子说明为什么要使用模板方法模式:

有一个打印报表类Report完成表头、正文、表尾的打印代码如下:

package com.dxy.design.pattern.template;

public class Report {
	
	public void print() {
		//打印表头
		//打印正文
		//打印表尾
	}
}


客户端我们直接调用Report的print方法即可,当某一时刻,我们又想改一下表头的格式,那么我们修改打印表头的那段代码就可以了,但是修改完后我们又觉得还是原来的好,我们还得改回来,这就坑爹了,这时我们就可以使用模板方法模式了,因为打印表头、表尾、正文是必须的,我们首先定义打印报表的骨架:

package com.dxy.design.pattern.template;

public abstract class Report {
	
	public void print() {
		printHead();
		printBody();
		printTail();
	}
	
	public abstract void printHead();
	
	public abstract void printBody();
	
	public abstract void printTail();
	
}


我们可以讲具体的打印表头、正文、表尾的方式抽取出来,留给子类来实现:

package com.dxy.design.pattern.template;

public class ReportImpl extends Report {

	@Override
	public void printHead() {
		System.out.println("第一种方式实现打印表头");
	}

	@Override
	public void printBody() {
		System.out.println("第一种方式实现打印正文");
	}

	@Override
	public void printTail() {
		System.out.println("第一种方式实现打印表尾");
	}

}


如果有新的需求,我们直接添加一个实现Report的类即可:

package com.dxy.design.pattern.template;

public class ReportImpl1 extends Report {

	@Override
	public void printHead() {
		System.out.println("第二种方式实现打印表头");
	}

	@Override
	public void printBody() {
		System.out.println("第二种方式实现打印正文");
	}

	@Override
	public void printTail() {
		System.out.println("第二种方式实现打印表尾");
	}

}


这样我们就可以在不改变原有代码的基础上实现报表格式的改变,客户端调用:

package com.dxy.design.pattern.template;

public class Client {
	
	public static void main(String[] args) {
		Report report = new ReportImpl();
		report.print();
	}
}


当我们在实现某功能时,该功能的实现步骤不变,而每个步骤的实现可变时,我们就可以使用模板模式了。比如在持久层框架处理的时候都要经过以下几个过程:

1、获取会话2、开始实务3、提交到数据库4、提交事务5、关闭会话

而对于CRUD来说,这些过程都是一样的,只是提交到数据库的时候不同,这里就是采用的模板方法模式来进行代码优化的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值