博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式 - 模板方法模式(template method pattern) 具体解释
阅读量:6295 次
发布时间:2019-06-22

本文共 4373 字,大约阅读时间需要 14 分钟。

模板方法模式(template method pattern) 详细解释

本文地址: http://blog.csdn.net/caroline_wendy

模板方法模式(template method pattern): 在一个方法中定义一个算法的骨架, 而将一些步骤延迟到子类中. 

模板方法使得子类能够在不改变算法结构的情况下, 又一次定义算法中的某些步骤.

模板方法能够进行挂钩(hook), 钩子(hook)是一种被声明在抽象类中的方法, 但仅仅有空的或者默认的实现.

钩子的存在, 能够让子类有能力对算法的不同点进行挂钩.

抽象类的框架:

/** * @time 2014年6月18日 */package template_method;/** * @author C.L.Wang * */public abstract class AbstractClass {		final void templateMethod() {		primitiveOperation1();		primitiveOperation2();		concreteOperation();		hook();	}		abstract void primitiveOperation1();		abstract void primitiveOperation2();		final void concreteOperation() {			}		void hook() {}}

面向对象原则:

好莱坞原则: 别调用我们, 我们会调用你.

详细方法:

1. 抽象类(abstract class), 包括模板方法(template method), 抽象操作(abstract operation)

详细操作(concrete operation), 和钩子(hook).

/** * @time 2014年6月18日 */package template_method;/** * @author C.L.Wang * */public abstract class CaffeineBeverage {		final void prepareRecipe() { //模板方法		boilWater();		brew();		pourInCup();		if(customerWantsCondiments()) {			addCondiments();		}	}		abstract void brew(); //抽象操作		abstract void addCondiments();		void boilWater() { //详细操作		System.out.println("Boiling water");	}		void pourInCup() {		System.out.println("Pouring into cup");	}		boolean customerWantsCondiments() { //钩子		return true;	}	}
2. 详细类(concrete class), 继承(extend) 抽象类(abstract class).

/** * @time 2014年6月18日 */package template_method;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/** * @author C.L.Wang * */public class CoffeeWithHook extends CaffeineBeverage {	/* (non-Javadoc)	 * @see template_method.CaffeineBeverage#brew()	 */	@Override	void brew() {		// TODO Auto-generated method stub		System.out.println("Dripping Coffee through filter");	}	/* (non-Javadoc)	 * @see template_method.CaffeineBeverage#addCondiments()	 */	@Override	void addCondiments() {		// TODO Auto-generated method stub		System.out.println("Adding Sugar and Milk");	}		public boolean customerWantsCondiments() { //钩子				String answer = getUserInput();				if (answer.toLowerCase().startsWith("y")) {			return true;		} else {			return false;		}			}	private String getUserInput() {				String answer = null;				System.out.println("Would you like milk and sugar with your coffee (y/n)? ");				BufferedReader in = new BufferedReader(new InputStreamReader(System.in));				try {			answer = in.readLine();		} catch (IOException ioe) {			System.out.println("IO error trying to read your answer");		}				if (answer == null) {			return "no";		}				return answer;	}	}/** * @time 2014年6月18日 */package template_method;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/** * @author C.L.Wang * */public class TeaWithHook extends CaffeineBeverage {	/* (non-Javadoc)	 * @see template_method.CaffeineBeverage#brew()	 */	@Override	void brew() {		// TODO Auto-generated method stub		System.out.println("Steeping the tea");	}	/* (non-Javadoc)	 * @see template_method.CaffeineBeverage#addCondiments()	 */	@Override	void addCondiments() {		// TODO Auto-generated method stub		System.out.println("Adding Lemon");	}	public boolean customerWantsCondiments() {				String answer = getUserInput();				if (answer.toLowerCase().startsWith("y")) {			return true;		} else {			return false;		}			}	private String getUserInput() {				String answer = null;				System.out.println("Would you like lemon with your tea (y/n)?

"); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); try { answer = in.readLine(); } catch (IOException ioe) { System.out.println("IO error trying to read your answer"); } if (answer == null) { return "no"; } return answer; } }

3. 測试类, 包括钩子(hook)操作.

/** * @time 2014年6月18日 */package template_method;/** * @author C.L.Wang * */public class BeverageTestDrive {	/**	 * @param args	 */	public static void main(String[] args) {		// TODO Auto-generated method stub		TeaWithHook teaHook = new TeaWithHook();		CoffeeWithHook coffeeHook = new CoffeeWithHook();				System.out.println("\nMaking tea...");		teaHook.prepareRecipe();				System.out.println("\nMaking coffee...");		coffeeHook.prepareRecipe();	}}
4. 输出:

Making tea...Boiling waterSteeping the teaPouring into cupWould you like lemon with your tea (y/n)?

y Adding Lemon Making coffee... Boiling water Dripping Coffee through filter Pouring into cup Would you like milk and sugar with your coffee (y/n)? n

你可能感兴趣的文章
[使用帮助] PHPCMS V9内容模块PC标签调用说明
查看>>
基于RBAC权限管理
查看>>
数学公式的英语读法
查看>>
留德十年
查看>>
迷人的卡耐基说话术
查看>>
PHP导出table为xls出现乱码解决方法
查看>>
PHP问题 —— 丢失SESSION
查看>>
Java中Object类的equals()和hashCode()方法深入解析
查看>>
数据库
查看>>
dojo.mixin(混合进)、dojo.extend、dojo.declare
查看>>
Python 数据类型
查看>>
iOS--环信集成并修改头像和昵称(需要自己的服务器)
查看>>
PHP版微信权限验证配置,音频文件下载,FFmpeg转码,上传OSS和删除转存服务器本地文件...
查看>>
教程前言 - 回归宣言
查看>>
PHP 7.1是否支持操作符重载?
查看>>
Vue.js 中v-for和v-if一起使用,来判断select中的option为选中项
查看>>
Java中AES加密解密以及签名校验
查看>>
定义内部类 继承 AsyncTask 来实现异步网络请求
查看>>
VC中怎么读取.txt文件
查看>>
如何清理mac系统垃圾
查看>>