Template Method(模板方法)模式

   普通方法的方法体定义了一个语句序列。在这个语句序列中通常会出现对当前对象方法的调用,以及对其他对象方法的调用。从这种意义上说,普通的方法就是一个“模板”,它给出了计算机执行的指令序列。不过Template Method模式所涉及到的则是一个更为特殊的模板类型。

     在编写一个方法的时候,考虑到算法的某些步骤可能会有不同的实现方法,我们可能会首先定义出算法的框架。这样,在定义方法的时候,我们可以将某些步骤定义为抽象方法,或者是将它们定义为存根方法(方法体为空的方法),也可以将它们定义了某个单独接口中的方法。这就产生了一个更为严格的“模板”,它明确定义了算法中的哪些步骤可以由其他类提供。

    

     Template Method模式的目的就是在一个方法中实现一个算法,并将算法中某些步骤的定义推迟,从而使得其他类可以重新定义这些步骤。

 

1.经典范例:排序

   排序是Template Method模式的古代范例。排序算法这个基本过程规程,只要修改其中的一个关键步骤--对象比较,就可以对其他各种对象集合的各种属性利用这个算法。

 

  Arrays和Collections类提供sort()静态方法,参数为一个数组,并使用可选的比较器(comparator)。ArrayList类的sort()方法是个实例方法,对sort()消息的接受者进行排序。换句话说,这些方法共享一个公共策略,这个策略依赖Comparable和Comparator接口,如图1所示:


Collections类中sort()方法使用本图中的接口

 

Arrays和Collection类的sort()方法允许你在需要时提供Comparator接口的实例。如果在不提供如此接口的情况下使用sort()方法,该方法将依赖Comparable接口的compareTo()方法。在对象没有实现Comparable接口的情况下,如果不提供Comparator实例就对对象进行排序,则程序会抛出异常。请注意,诸如String之类最基本的类型确实都实现Comparable接口

    sort()方法可以说是Template Method模式的一个范例;类库提供比较两个对象的关键操作,可以放入自己算法中。compare()方法返回一个小于、等于或大于0的数字。某种意义上说,这些值分别代表着:对象o1小于、等于或大于o2。例如,如下代码首先根据远地点,接着根据火箭名称,对多个火箭进行排序(火箭构造器的参数包括名称、质量、价格、远地点以及推进力)。

 下面是比较程序ApogeeComparator:

package app.templateMethod;

import java.util.Comparator;
import com.oozinoz.firework.Rocket;

public class ApogeeComparator implements Comparator
{
	public int compare(Object o1,Object o2)
	{
		Rocket r1 = (Rocket)o1;
		Rocket r2 = (Rocket)o2;
		return Double.compare(r1.getApogee(),r2.getApogee());
	}
}

和NameComparetor:

package app.templateMethod;

import java.util.Comparator;
import com.oozinoz.firework.Rocket;

public class NameComparator implements Comparator
{
	public int compare(Object o1,Object o2)
	{
		Rocket r1 = (Rocket)o1;
		Rocket r2 = (Rocket)o2;
		return r1.toString().compareTo(r2.toString());
	}
}

 

 

 

    该程序的显示内容取决于Rocket如何实现toString(),会以两种排序方式显示火箭。

    排序是一种通用算法,差别只有一个步骤,与应用程序或者应用领域的细节都无关。这个关键步骤就是比较两个对象。比如,任何常见的排序算法都不包含比较火箭远地点这样的具体领域知识;在应用于具体环境时,就需要加上这种知识和实际比较对象。借助于sort()方法和Comparator接口,我们可以把明确的比较知识加入到统一排序算法中。

     Template Method模式并不局限于缺失部分就是领域知识这样的情况。有时候,会将整个算法应用到具体应用领域。

 

2.完成算法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值