设计模式——模板方法模式

定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些步骤。

注意:如果某些步骤是可选的,那么可以引入“钩子”方法作为判断条件,是否执行某些可选步骤。“钩子”不是必要的。

模板 ?,一个方法,算法的一组步骤(一组子方法,其中任何子步骤都可以抽象,由子类实现(primitiveOperation),或者部分方法(concreteOperation,一般为final类型)在基类实现),这样确保算法结构不变。

一般基类为抽象类,模板方法(template Method())被声明为final类型,不允许子类修改

例子

       以冲泡茶和咖啡为例,

茶:

  1. 把水煮沸

  2. 用沸水泡茶叶

  3. 把茶倒入杯子

  4. 加柠檬

咖啡:

  1. 把水煮沸

  2. 用沸水泡咖啡粉

  3. 把咖啡倒入杯子

  4. 加糖和牛奶

冲泡步骤基本相同,知识2,4步骤不同,抽取基类:

咖啡因饮料:

  1. 把水煮沸

  2. 冲泡

  3. 把饮料倒入杯子

  4. 加调料

设计模式——模板方法模式

好莱坞原则别打电话给(调用)我们,我们会打电话(调用)你。

在这里,意思是饮料客户只依赖基类CaffeineBeverage,而不依赖具体的Tea或Caffee,这样可以减少整个系统的依赖

应用场景:

  1. 没有继承关系的模板方法。java中数组的sort方法,sort内部调用辅助方法mergSort方法(这个就是模板方法),而抽象步骤为数组中的元素需要实现comparable接口。

  2. java.io.InputStream类的read方法由子类实现,被read(byte b[],int off,int len)模板方法使用。

  3. Swing的JFrame的paint方法,作为钩子绘制,可以不覆盖;Applet的init、start、stop等方法作为钩子可以在Applet初始化、启动、停止时加上自己的动作。

总结:模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新的定义算法的某些步骤。

注意:模板方法模式和策略模式一样都是封装算法,前者用继承(不一定),后者用组合。

你可能感兴趣的:(设计模式——模板方法模式)