《9》模版方法模式
来源:互联网 发布:对软件验收标准 编辑:程序博客网 时间:2024/06/07 06:59
设计原则7(好莱坞原则):
别调用(打电话给)我们,我们会调用(打电话给)你
理解:
允许底层组件挂钩到高层,但由高层组建决定什么时候和怎样使用底层组件;
区别与”依赖倒置原则“,依赖倒置强调的是不依赖具体类;
而本规则中,是在已经依赖一个具体类的基础上了,父类调用子类完成功能的同时,子类又调用父类实现自己的功能;
下面来看看依赖这个规则的模版方法设计模式;
先看问题:
我们要自己动手制作咖啡因饮料,现有品种是Coffee&Tea两类,我们需要完成以下步
骤,才能完成制作
好了,现在轮到我们设计啦
上设计图(山寨版):
上代码(钢筋混凝土):
方法模版类:
public abstract class CaffeeineBeverage {//方法骨架要设计成final 防止被修改final void prepareBeverage(){boilWater();brew();pourInCup();addCondiments();}//算法骨架里的固有步骤,设置成peivate|final,保护起来 private void pourInCup() { System.out.println("pourInCup");}private void boilWater() {System.out.println("boilWater");}//这里是需要子类重新定义的步骤,写成abstract,”提醒“子类实现abstract void brew();abstract void addCondiments();}
负责步骤重定义的子类:
public class Tea extends CaffeeineBeverage{@Overridevoid brew() {System.out.println("使用沸水泡茶");}@Overridevoid addCondiments() {System.out.println("往茶中加入柠檬");}}
直接给出模版方法定义:
在一个方法中定义一个算法骨架,而将一些步骤的实现延迟到子类,模版方法可以使子类在不修改算法结构的情况下,重新定义算法的某些步骤
理解:
算法骨架是不能动的,”某些“改成”全部“这个骨架子类不就可以完全掌控了,此时方法模版类也就失去了作用;
注意到上面的实现代码其实有讲到三个部分:骨架主体、固有步骤,重定义步骤,其实还有一个钩子
钩子:
可以修改上面的工程代码如下:
//方法骨架要设计成final 防止被修改final void prepareBeverage(){boilWater();brew();pourInCup();addCondiments();hook();} void hook() {}
理解:
定义了一个子类可选择重写的空方法或者说默认方法,因为子类不重写即为默认,
1》它可以让子类实现算法中的可选部分
2》可以让子类可以控制 方法模版对即将发生的事情 做出 符合子类身份的反应
对于第二点提供例子解释:
//方法骨架要设计成final 防止被修改final void prepareBeverage(){boilWater();brew();pourInCup();if(hook()){addCondiments();}} boolean hook() {return true;}
这样子类就可以通过hook()来控制方法模版的行为,
比如:我是”白水“子类,不需要加入调料,这不符合我的身份
注意”空方法“的理解,空实现或者默认的实现
拓展:
注意和策略模式的区别。策略模式是一个完整的方法实现,而方法模版则是步骤由子类组合而来;
这里为什么说组合而不是”继承“,因为我们的例子用的就是继承啊,我想说将子类(这里不应该说子类,我们要将继承关系拿掉)抽象成另一个新的接口,让模版方法类对接口编程,
然后调用传入子类的brew&addCondiments方法,来完成模版方法,也是模版方法模式
再来看看和策略模式的区别。策略模式是全权委托,我们这是部分调用主逻辑还在我们这,
怎么用我们说了算
- 《9》模版方法模式
- 模版方法模式
- 模版方法模式
- 七、模版方法模式
- 模版方法设计模式
- java 模版方法模式
- 模版方法模式
- 模版方法模式
- 模版方法模式
- 7.模版方法模式
- 模版方法模式
- java 模版方法模式
- 模版方法设计模式
- 模版方法模式
- java 模版方法模式
- 模版方法模式
- 模版方法模式
- 模版方法模式
- 关于百度富文本配置,应用及将其存入数据库
- 安装mongodb副本分片集群
- 串口自适应波特率的设置方法
- Java的反射(Reflection)、内省(Retrospector)和beanUtils工具
- html上的分享功能(jinthis)
- 《9》模版方法模式
- 三天学会HTML5——SVG和Canvas的使用
- Java回调函数使用
- 简单介绍redis以及ubuntu和windows下怎么安装redis和配置文件详解
- 112. Path Sum
- Android Studio Gradle
- 关于modbus
- 使用MD5对SharedPreference的重要数据进行加密
- 分解素因数 3