5、模板方法模式

一、引子 

 

  • 这是一个很简单的模式,却被非常广泛的使用。之所以简单是因为在这个模式中仅仅使用到了继承关系。
  • 继承关系由于自身的缺陷,被专家们扣上了“罪恶”的帽子。
  • “使用委派关系代替继承关系”,“尽量使用接口实现而不是抽象类继承”等等专家警告,让我们这些菜鸟对继承“另眼相看”。
  • 其实,继承还是有很多自身的优点所在。只是被大家滥用的似乎缺点更加明显了。
  • 合理的利用继承关系,还是能对你的系统设计起到很好的作用的。
  • 而模板方法模式就是其中的一个使用范例。

二、定义

 

  • GOF给模板方法(Template Method)模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
  • 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  • 这里的算法的结构,可以理解为你根据需求设计出来的业务流程。
  • 特定的步骤就是指那些可能在内容上存在变数的环节。
  • 可以看出来,模板方法模式也是为了巧妙解决变化对系统带来的影响而设计的。
  • 使用模板方法使系统扩展性增强,最小化了变化对系统的影响。这一点,在下面的举例中可以很明显的看出来。

三、结构

 

  • AbstractClass(抽象类):定义了一到多个的抽象方法,以供具体的子类来实现它们;
  • 而且还要实现一个模板方法,来定义一个算法的骨架。
  • 该模板方法不仅调用前面的抽象方法,也可以调用其他的操作,只要能完成自身的使命。
  • ConcreteClass(具体类):实现父类中的抽象方法以完成算法中与特定子类相关的步骤

四、模板方法适用于以下情况

 

  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
  • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。其实这可以说是一种好的编码习惯了
  • 控制子类扩展。模板方法只在特定点调用操作,这样就只允许在这些点进行扩展。
  • 如果你不愿子类来修改你的模板方法定义的框架,你可以采用两种方式来做:
  • 一是在API中不体现出你的模板方法;
  • 二是将你的模板方法置为final就可以了
五、好处
  • 使用模板方法模式可以将代码的公共行为提取出来,达到复用的目的。
  • 而且,在模板方法模式中,是由父类的模板方法来控制子类中的具体实现。
  • 这样你在实现子类的时候,根本不需要对业务流程有太多的了解。 

六、示例

 

public abstract class TemplateDemo
{
	public void runBare() throws Throwable {
	 setUp();
	 try {
	  runTest();
	 }
	 finally {
	  tearDown();
	 }
	}
	void setUp() throws Exception {}
	void tearDown() throws Exception {}
	abstract void runTest();//需要子类实现的特定步骤
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值