您的位置:首页 > 其它

行为模式之Template(模板模式)

2015-01-21 20:57 253 查看
模板模式定义一系列的操作流程,并将其中的一个或多个操作的实现延迟到子类之中.

我们以牛奶加工过程为例,当然对其做了简化,具体流程如下图:



首先,将加工过程定义成一个抽象类:

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();
	}
}


结果:

机器挤奶...
杀菌.....
打包.....


小结:

从上面例子中,可以看出只要引入新的实现方式(子类),模板方法所定义的代理不需要做任何改变,有效保证了扩展性,

当然也满足了设计原则中的开闭原则
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: