Template Method 模式小结

在编写一个方法的时候,考虑到算法的某些步骤可能会有不同的实现方法,我们可能会首先定义算法的框架。这样,在定义方法的时候,可以将默写具体的步骤定义为抽象方法,或者是将它们定义为存根方法,也可以定义为某个单独的接口中的方法。这就产生了一个严格的模板。

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]);
  }
 }
}
结果输出:

 

就是这样吧~~~~

你可能感兴趣的:(算法,String,Collections,Arrays,Class,产品)