设计模式学习之路 - 模板方法模式 - 专注于流程

来源:互联网 发布: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中, 超类定义了总的泡东西的一个框架,把步骤列出来了,这样的话,他的模板方法就定住了, 而把具体的操作留给子类去实现。

这样的好处就是子类不会影响到整个的流程, 只需要负责自己这一块的实现就行了。


在平时的开发中,有很多地方会使用到模板方法模式, 这个方法比较简单,这里就不一一列举了。


有什么错误的地方还望纠正, 和大家共勉!




0 0
原创粉丝点击