设计模式(22)——Template Method(模板方法)

来源:互联网 发布:linux中more命令 编辑:程序博客网 时间:2024/06/16 14:26

模板方法是什么?

模板方法定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。这样的话,子类可以修改算法的某些步骤,而不会改变算法的结构。


模板方法的适用范围

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 {@Overridepublic void doSelect() {System.out.println("Item added to online shopping cart,");System.out.println("Get gift wrap preference,");System.out.println("Get delivery address.");}@Overridepublic void doPayment() {System.out.println("Online Payment through Netbanking/Cards.");}@Overridepublic void doDelivery() {System.out.println("Ship the item through post to delivery address");}}

实体店订单:
public class StoreOrder extends OrderProcessTemplate {@Overridepublic void doSelect() {System.out.println("Customer chooses the item from shelf.");}@Overridepublic void doPayment() {System.out.println("Pays at counter through cash/POS");}@Overridepublic 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/


0 0
原创粉丝点击