在编写一个方法的时候,考虑到算法的某些步骤可能会有不同的实现方法,我们可能会首先定义算法的框架。这样,在定义方法的时候,可以将默写具体的步骤定义为抽象方法,或者是将它们定义为存根方法,也可以定义为某个单独的接口中的方法。这就产生了一个严格的模板。
Template Method 模式的目的就是在一个方法中实现一个算法,并将算法的某些步骤的定义推迟,从而使得其他类可以重新定义这些步骤。
对于这一模板的最经典的范例感觉STL中sort()方法的实现了。当然Java中Arrays和Collections类也体现了这一思想,只不过是一个静态方法,但是使用了可选的比较器(Comparator)。ArriyList类的sort()方法是个实例方法,对sort()消息的接收者进行排序。换句话说就是,这些方法共享一个公共策略,这个策略依赖与Comparable和Comparator接口,如下图所示:
Arrays和Collections类的sort()方法允许你在需要的时候提供Comparator接口的实例。如果在不提供此接口的情况下使用sort()方法,该方法将依赖Comparable接口的comparaTor()方法。而在没有实现Comparable接口的情况下如果不提供Comparator实例就对对象进行排序,则程序会抛出异常。
在这里sort()方法可以说是Template Method模式的一个范例;类库提供两个对象比较的关键步骤,可以进入自己的算法中。compare()方法返回一个<、=、>0的数字。意义很显然~~~~
举一个例子:如我们有一个订单类(构造器的参数包括编号,金额,货物数量,地点),不同的情况下我们需要按照不同的标准对订单进行分来,这样选择Template Method 模式将会是个很好的选择。代码如下::
订单类实现:
package com.houjx.template;
public class Reservation {
private String name;
private double money;
private int proCount;
private String place;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public int getProCount() {
return proCount;
}
public void setProCount(int proCount) {
this.proCount = proCount;
}
public String getPlace() {
return place;
}
public void setPlace(String place) {
this.place = place;
}
public Reservation(String name,double money,int proCount,String place){
this.money=money;
this.name=name;
this.place=place;
this.proCount=proCount;
}
public static void title(){
System.out.println("订单名/t/t地址/t/t产品数量/t/t订单金额");
}
public String toString(){
return this.name+"/t/t"+this.place+"/t/t"+this.proCount+"/t/t"+this.money;
}
}
订单名比较器:
package com.houjx.mycomp;
import java.util.Comparator;
import com.houjx.template.Reservation;
/** 按名字字典顺序排序*/
@SuppressWarnings("unchecked")
public class CompByName implements Comparator{
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
Reservation r1=(Reservation)o1;
Reservation r2=(Reservation)o2;
return r1.getName().compareTo(r2.getName());
}
}
产品数量比较器:
package com.houjx.mycomp;
import java.util.Comparator;
import com.houjx.template.Reservation;
public class CompByCount implements Comparator<Reservation>{
@Override
public int compare(Reservation o1, Reservation o2) {
return o1.getProCount()-o2.getProCount();
}
}
产品金额比较器:
package com.houjx.mycomp;
import java.util.Comparator;
import com.houjx.template.Reservation;
public class CompByMoney implements Comparator<Reservation>{
@Override
public int compare(Reservation o1, Reservation o2) {
// TODO Auto-generated method stub
return Double.compare(o1.getMoney(), o2.getMoney());
}
}
测试代码:
package com.houjx.template;
import java.util.Arrays;
import com.houjx.mycomp.CompByCount;
import com.houjx.mycomp.CompByMoney;
import com.houjx.mycomp.CompByName;
public class TestTemplate {
@SuppressWarnings("unchecked")
public static void main(String []args){
Reservation rs1=new Reservation("HuaWei",560.5,10,"WuHan");
Reservation rs2=new Reservation("Sina",61056.5,50,"BeiJing");
Reservation rs3=new Reservation("Yahoo!",98754.1,60,"BeiJing");
Reservation rs4=new Reservation("Google",10000000.9,110,"USA");
Reservation rs5=new Reservation("ZTE",986.01,10,"ShenZ");
Reservation rs6=new Reservation("Alibab",1102.58,25,"HangZ");
Reservation []arrRes=new Reservation[]{rs1,rs2,rs3,rs4,rs5,rs6};
System.out.println("Sorted by 订单名:");
Arrays.sort(arrRes,new CompByName());//利用CompByName()比较器
int i=0;
Reservation.title();
for(i=0;i<arrRes.length;i++){
System.out.println(arrRes[i]);
}
System.out.println("Sorted by 产品数量:");
Arrays.sort(arrRes,new CompByCount());//利用CompByCount()比较器
Reservation.title();
for(i=0;i<arrRes.length;i++){
System.out.println(arrRes[i]);
}
System.out.println("Sorted by 订单金额:");
Arrays.sort(arrRes,new CompByMoney());//利用CompByMoney()比较器
Reservation.title();
for(i=0;i<arrRes.length;i++){
System.out.println(arrRes[i]);
}
}
}
结果输出:
就是这样吧~~~~