模板模式定义一系列的操作流程,并将其中的一个或多个操作的实现延迟到子类之中.
我们以牛奶加工过程为例,当然对其做了简化,具体流程如下图:
首先,将加工过程定义成一个抽象类:
AbstractMilkProcess
package com.design; /**牛奶加工过程 * @author wobendiankun *2015-1-21 下午08:01:57 */ public abstract class AbstractMilkProcess { /** *挤奶 */ protected abstract void milking(); /** * 杀菌 */ protected void sterilize(){ System.out.println("杀菌....."); } /** * 打包 */ protected void packaging(){ System.out.println("打包....."); } /** * 模版方法 */ public void handle(){ milking(); sterilize(); packaging(); } }handle()模板方法调用一系列的流程,其中milking()的实现延迟到子类实现
其次,创建一个基于人工挤奶的流程
ManualMilkProcess
package com.design; /**手工处理 * @author wobendiankun *2015-1-21 下午08:07:11 */ public class ManualMilkProcess extends AbstractMilkProcess{ @Override public void milking() { System.out.println("手工挤奶..."); } }ManualMilkProcess类实现具体的milking()操作
测试类:
package com.design; /** * @author wobendiankun *2015-1-21 下午07:48:25 */ public class TemplateTest { public static void main(String[] args) { AbstractMilkProcess process = new ManualMilkProcess(); process.handle(); } }运行结果:
手工挤奶... 杀菌..... 打包.....
当经济条件允许的情况下,有钱任性,不需要手工挤奶,采用机器挤奶
MachineMilkProcess
package com.design; /**机器处理 * @author wobendiankun *2015-1-21 下午08:40:51 */ public class MachineMilkProcess extends AbstractMilkProcess { /* (non-Javadoc) * @see com.design.AbstractMilkProcess#milking() */ @Override protected void milking() { System.out.println("机器挤奶..."); } }测试代码:
package com.design; /** * @author wobendiankun *2015-1-21 下午07:48:25 */ public class TemplateTest { public static void main(String[] args) { // process = new ManualMilkProcess(); AbstractMilkProcess process = new MachineMilkProcess(); process.handle(); } }结果:
机器挤奶... 杀菌..... 打包.....
小结:
从上面例子中,可以看出只要引入新的实现方式(子类),模板方法所定义的代理不需要做任何改变,有效保证了扩展性,
当然也满足了设计原则中的开闭原则
时间: 2024-10-05 04:10:08