设计模式之模板方法模式(java)
2017-01-18 20:48
477 查看
其实有些设计模式在潜移默化的编码当中你是已经掌握的了,只不过你没系统的去学习设计模式之前你不知道它统一的名称叫什么,统一概念和名词的好处就是减少沟通的成本,并能过滤掉一些小白。
模板方法模式说起来非常简单,本身概念也很容易掌握,就是把通用的代码部分封装好一个模板,方便之后重复利用。
这里还是引用head first中的例子,coffee和tea的制作过程分别是:
coffee
(1)把水煮沸
(2)用沸水冲泡咖啡
(3)把咖啡倒进杯子
(4)加糖和牛奶
tea
(1)把水煮沸
(2)用沸水侵泡茶叶
(3)把茶倒进杯子
(4)加柠檬
代码是这样实现的:
可以看出整体流程是一致的,(1)(3)操作又是完全的一致,(2)(4)操作是一样只不过应用在不同饮料上
好,看看如何把通用的抽象出来做成一个模板:
打完一套,收工。。。
模板方法模式说起来非常简单,本身概念也很容易掌握,就是把通用的代码部分封装好一个模板,方便之后重复利用。
这里还是引用head first中的例子,coffee和tea的制作过程分别是:
coffee
(1)把水煮沸
(2)用沸水冲泡咖啡
(3)把咖啡倒进杯子
(4)加糖和牛奶
tea
(1)把水煮沸
(2)用沸水侵泡茶叶
(3)把茶倒进杯子
(4)加柠檬
代码是这样实现的:
public class Coffee { void prepareRecipe() { boilWater(); brewCoffeeGrinds(); pourCup(); addSugarAndMilk(); } private void addSugarAndMilk() { System.out.println("addSugarAndMilk"); } private void pourCup() { System.out.println("pourCup"); } private void brewCoffeeGrinds() { System.out.println("brewCoffeeGrinds"); } private void boilWater( bcd7 ) { System.out.println("boilWater"); } }
public class Tea { void prepareRecipe() { boilWater(); steepTeaBag(); pourCup(); addLemon(); } private void boilWater() { System.out.println("boilWater"); } private void steepTeaBag(){ System.out.println("steepTeaBag"); } private void pourCup() { System.out.println("pourCup"); } private void addLemon() { System.out.println("addLemon"); } }
可以看出整体流程是一致的,(1)(3)操作又是完全的一致,(2)(4)操作是一样只不过应用在不同饮料上
好,看看如何把通用的抽象出来做成一个模板:
public abstract class CaffeineBeverage { final void prepareRecipe() { boilWater(); brew(); pourCup(); addCondiments(); } abstract void brew(); abstract void addCondiments(); private void boilWater() { System.out.println("Boiling water"); } private void pourCup() { System.out.println("Pouring into cup"); } }
public class Tea extends CaffeineBeverage{ @Override void brew() { System.out.println("Steeping the tea"); } @Override void addCondiments() { System.out.println("Adding Lemon"); } }
public class Coffee extends CaffeineBeverage{ @Override void brew() { System.out.println("Dripping Coffee through filter"); } @Override void addCondiments() { System.out.println("Adding Sugar and Milk"); } }
打完一套,收工。。。
相关文章推荐
- Java多线程系列--“基础篇”03之 Thread中start()和run()的区别
- Spring_9_SpEL表达式
- javase字符流转换
- Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
- Spring Boot 学习(一) 快速搭建SpringBoot 项目
- Myeclipse TODO的使用
- Java多线程系列--“基础篇”01之 基本概念
- Java集合Map,set, list 之间的转换
- Java考试题之十
- Java考试题之十
- Java考试题之十
- Java考试题之九
- Java考试题之九
- Java考试题之九
- Integer与int的那些小事
- java设计模式大话之简单工厂模式
- Java中矩阵运算(math3的使用)
- Java之使用接口
- 深入理解 Java 反射:Method (成员方法)
- 深入理解 Java 反射:Field (成员变量)