设计模式学习之路 - 模板方法模式 - 专注于流程
来源:互联网 发布:sql truncate 函数 编辑:程序博客网 时间:2024/06/06 16:47
今天我们了解一下模板方法模式。
这个模式,我觉得大家听的不多,但是用的特别多,稍微有点年限的程序猿应该都在经常使用这个模式(但是可能不知道, 或者是这个模式的变相)
模板,就是一个通用的东西, 平时大家在编程的时候,只要遇到相同的代码,都会提取方法出来,然后共用方法,减少代码量,
这是最基本的重构,稍微有点强迫症的人会经常这样做, 而模板方法,只是比这个稍微高级一丢丢,关注点也不一样。
平时大家做事的时候会喝点东西,比如,咖啡,茶什么的。
然后我们现在需要泡一杯咖啡或者泡一杯茶给自己润润嗓子。
大家都知道泡咖啡的步骤:1.烧开水 2.用开水冲咖啡 3.把咖啡倒进杯子 4.加点糖或者奶
package com.chris.template;public class Coffee {void prepareRecipe(){boilWater();brewCoffeeGrinds();pourInCup();addSugarAndMilk();}public void boilWater(){System.out.println("Boiling water");}public void brewCoffeeGrinds(){System.out.println("Dripping Coffee through filter");}public void pourInCup(){System.out.println("Pouring into cup");}public void addSugarAndMilk(){System.out.println("Adding Sugar and Milk");}}
同样,茶大家泡的也不会少: 1.烧开水 2.用开水浸泡茶叶 3.把茶倒进杯子 4.加点柠檬或者什么
package com.chris.template;public class Tea {void prepareRecipe(){boilWater();steepTeaBag();pourInCup();addLemon();}public void boilWater(){System.out.println("Boiling water");}public void steepTeaBag(){System.out.println("Steeping the tea");}public void pourInCup(){System.out.println("Pouring into cup");}public void addLemon(){System.out.println("Adding Lemon");}}
然后,我们可以发现,其实泡咖啡和泡茶,虽然不是一个事情,但是他的操作方法十分的相似,是不是可以提取出来些什么。。
烧开水和倒进杯子是一样的,其他的两个操作,一个是泡东西, 一个是加调料,这样看来, 其实,两个的操作是一样的。。
然后我们提取出一个超类,咖啡因饮料(其实茶中有咖啡因。。)
package com.chris.template;public abstract class CaffeineBeverage {final void prepareRecipe(){boilWater();brew();pourInCup();addCondiments();}public void boilWater(){System.out.println("Boiling water");}public void pourInCup(){System.out.println("Pouring into cup");}public abstract void brew();public abstract void addCondiments();}
这个超类中,有两个抽象方法,我们不在超类中作实现,把他的实现延迟到子类中去。
这样的话, 上面两个饮料就可以去继承这个超类了,并且实现它的抽象方法。
新的Coffee类。。
package com.chris.template.template;import com.chris.template.CaffeineBeverage;public class Coffee extends CaffeineBeverage{@Overridepublic void brew() {System.out.println("Dripping Coffee through filter");}@Overridepublic void addCondiments() {System.out.println("Adding Sugar and Milk");}}
新的Tea类。。
package com.chris.template.template;import com.chris.template.CaffeineBeverage;public class Tea extends CaffeineBeverage{@Overridepublic void brew() {System.out.println("Steeping the tea");}@Overridepublic void addCondiments() {System.out.println("Adding Lemon");}}
到这里, 模板方法模式就完成了!!!
我们贴下定义: 在一个方法中定义一个算法的骨架, 而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
在demo中, 超类定义了总的泡东西的一个框架,把步骤列出来了,这样的话,他的模板方法就定住了, 而把具体的操作留给子类去实现。
这样的好处就是子类不会影响到整个的流程, 只需要负责自己这一块的实现就行了。
在平时的开发中,有很多地方会使用到模板方法模式, 这个方法比较简单,这里就不一一列举了。
有什么错误的地方还望纠正, 和大家共勉!
- 设计模式学习之路 - 模板方法模式 - 专注于流程
- 模板方法模式(学习于 php设计模式 书 )
- 设计模式的学习之路--模板方法设计模式
- 设计模式学习之路-模板方法模式
- 设计模式学习之---模板方法设计模式
- 学习设计模式之禅——模板方法模式
- 设计模式学习笔记之模板方法模式
- HeadFirst 设计模式学习之模板方法模式
- java设计模式学习之模板方法模式
- 设计模式之模板方法模式模板方法模式
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- Hdu 4494 Teamwork(最小费用流)
- HDU 5802 Windows 10 (贪心)
- Linux 批量修改文件名
- 设计模式六大原则(3)依赖倒置原则(Dependence Inversion Principle)
- 尼姆博弈
- 设计模式学习之路 - 模板方法模式 - 专注于流程
- 1050. 螺旋矩阵(25)-PAT乙级真题
- 常用JS键盘鼠标事件
- HDU:3665 Seaside(dijkstra算法求最短路径)
- 分拆素数和
- POJ 3268Silver Cow Party
- find_if_not 源码剖析
- 神经网络:学习(2)
- spring (2.5, 3.2) 在 jre 1.8下的fix