小A:“通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步聚,并确定了这些步聚的执行顺序。但是某些步聚的具体实现是未知的,或者是某些步聚的实现与具体的环境相关。”
大B:“模板方法模式把我们不知道具体实现的步骤封装成抽象方法,提供一些按正确顺序调用它们的具体方法(这些具体方法统称为模板方法),这样构成一个抽象基类。子类通过继承这个抽象基类去实现各个步聚的抽象方法,而工作流程却由父类来控制。”
小A:“什么是模板方法模式?”
大B:“定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。”
小A:“要如何去实现它哩?”
大B:“模板模式,是众多模式之中用得比较多的模式,在具体的应用中,我们已经经意或者不经意的采用了这种模式。其是先写定义,后实现,然后再调用,将实现与调用分开,从而利用增强了程序的延展性。模板模式是利用了虚函数的多态性,我们可以实现,也可以不实现。”
public abstract class AbstractOrder{
public Order placeOrder(int customerId,List orderItemList){
int total=0;
for(int i=0;igetSpendingLimit(customerId)){
throw new BusinessException(“超出信用额度” getSpendingLimit(customerId));
}
int orderId=saveOrder(customerId,total,orderItemList);
return new OrderImpl(orderId,total);
}
public abstract int getOrderItemPrice(OrderItem orderItem);
public abstract int getSpendingLimit(int customerId);
public abstract int saveOrder(int customerId,int total,List orderItemList);
}
rendercode();
AbstractOrder在placeOrder方法中确定了定单处理的逻辑,placeOrder方法也称为模板方法。在placeOrder中调用了三个抽象方法。子类只需要去实现三个抽象方法,而无需要去关心定单处理的逻辑。