模版模式,给相似的,或者使用同一工做流程的产品定义一个模版,尽可能减小程序修改时候的成本。ide
咱们直接使用路虎的例子。如今须要给路虎汽车定义一个模版,可以包含基本的行为和行驶的工做流程。函数
总体类图以下:this
汽车的一系列动做能够归纳成:启动汽车,发动机运行,鸣笛,停车。这四个方法是全部汽车都要进行的工做,因此在抽象类中实现。假设全部的汽车都要走这个么流程的,则能够直接在抽象类中实现这些方法调用的封装。启动到停车这几个方法无需对用户可见,则定义为protected便可,run函数将会被调用,但不会被改变,因此,定义为final,spa
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方法进行实现:3d
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型号的汽车:code
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的实现:blog
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(); } }