模版模式
模版模式,给类似的,或者使用同一工作流程的产品定义一个模版,尽量减少程序修改时候的成本。
我们直接使用路虎的例子。现在需要给路虎汽车定义一个模版,能够包含基本的行为和行驶的工作流程。
整体类图如下:
汽车的一系列动作可以概括成:启动汽车,发动机运行,鸣笛,停车。这四个方法是所有汽车都要进行的工作,所以在抽象类中实现。假设所有的汽车都要走这个么流程的,则可以直接在抽象类中实现这些方法调用的封装。启动到停车这几个方法无需对用户可见,则定义为protected即可,run函数将会被调用,但不会被改变,所以,定义为final,
package com.cbf4life; /** * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you * all. Hummer Model是悍马车辆模型的意思,不是悍马美女车模 */ public abstract class HummerModel { /* * 首先,这个模型要能够被发动起来,别管是手摇发动,还是电力发动,反正 是要能够发动起来,那这个实现要在实现类里了 */ protected abstract void start(); // 能发动,那还要能停下来,那才是真本事 protected abstract void stop(); // 喇叭会出声音,是滴滴叫,还是哔哔叫 protected abstract void alarm(); // 引擎会轰隆隆的响,不响那是假的 protected abstract void engineBoom(); // 钩子方法,默认喇叭是会响的,子类中可以重载修改 protected boolean isAlarm() { return true; } // 那模型应该会跑吧,别管是人退的,还是电力驱动,总之要会跑 final public void run() { // 先发动汽车 this.start(); // 引擎开始轰鸣 this.engineBoom(); // 喇嘛想让它响就响,不想让它响就不响 if (this.isAlarm()) { this.alarm(); } // 到达目的地就停车 this.stop(); } }
H1型号的汽车是H1的特征,对这是个protected方法进行实现:
package com.cbf4life; /** * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you * all. 悍马车是每个越野者的最爱,其中H1最接近军用系列 */ public class HummerH1Model extends HummerModel { @Override public void alarm() { System.out.println("悍马H1鸣笛..."); } @Override public void engineBoom() { System.out.println("悍马H1引擎声音是这样在..."); } @Override public void start() { System.out.println("悍马H1发动..."); } @Override public void stop() { System.out.println("悍马H1停车..."); } }
H2型号的汽车:
package com.cbf4life; /** * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you * all. H1和H2有什么差别,还真不知道,真没接触过悍马 */ public class HummerH2Model extends HummerModel { @Override public void alarm() { System.out.println("悍马H2鸣笛..."); } @Override public void engineBoom() { System.out.println("悍马H2引擎声音是这样在..."); } @Override public void start() { System.out.println("悍马H2发动..."); } @Override public void stop() { System.out.println("悍马H1停车..."); } //H2车型默认的喇叭函数与其他车型不同,所以这里只需重载 @Override protected boolean isAlarm() { return false; } }
Client的实现:
package com.cbf4life; /** * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you * all. 客户开始使用这个模型 */ public class Client { public static void main(String[] args) { // 客户开着H1型号,出去遛弯了 HummerModel h1 = new HummerH1Model(); h1.run(); // 汽车跑起来了; // 客户开H2型号,出去玩耍了 HummerModel h2 = new HummerH2Model(); h2.run(); } }