模板方法是什么?
模板方法定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。这样的话,子类可以修改算法的某些步骤,而不会改变算法的结构。
模板方法的适用范围
1. 一次性实现算法的不变部分,将可变的行为留给子类实现
2. 提出子类中的公共部分到公共父类中,以避免代码重复
3. 控制子类扩展。
模板方式的示例
下面以商店的订单处理为例说明模板方式的使用:
public abstract class OrderProcessTemplate {
public boolean isGift;
public abstract void doSelect();
public abstract void doPayment();
public final void giftWrap() {
System.out.println("Gift wrap done.");
}
public abstract void doDelivery();
public final void processOrder() {
doSelect();
doPayment();
if (isGift) {
giftWrap();
}
doDelivery();
}
}
网络订单:
public class NetOrder extends OrderProcessTemplate {
@Override
public void doSelect() {
System.out.println("Item added to online shopping cart,");
System.out.println("Get gift wrap preference,");
System.out.println("Get delivery address.");
}
@Override
public void doPayment() {
System.out.println("Online Payment through Netbanking/Cards.");
}
@Override
public void doDelivery() {
System.out.println("Ship the item through post to delivery address");
}
}
实体店订单:
public class StoreOrder extends OrderProcessTemplate {
@Override
public void doSelect() {
System.out.println("Customer chooses the item from shelf.");
}
@Override
public void doPayment() {
System.out.println("Pays at counter through cash/POS");
}
@Override
public void doDelivery() {
System.out.println("Item deliverd to in delivery counter.");
}
}
模板方法测试:
public class TemplateMethodPatternClient {
public static void main(String... args) {
System.out.println("$$$$$$$ NetOrder instance of the Template: $$$$$$$");
OrderProcessTemplate netOrder = new NetOrder();
netOrder.processOrder();
System.out.println("$$$$$$$ StoreOrder instance of the Template: $$$$$$$");
OrderProcessTemplate storeOrder = new StoreOrder();
storeOrder.processOrder();
}
}
链接:http://javapapers.com/design-patterns/template-method-design-pattern/