《您的设计模式》(CBF4LIFE)之“模板方法模式”【整理】

模板方法:如下抽象类上的四个方法设置为protected访问权限,这四个方法都由子类来实现,那就设置成protected模式run方法子类都不修改,可以设置成final类型

package com.teng.pattern.impl;

/**
 * 悍马抽象类,模板设计模式
 * 
创建日期:2016年7月2日 *
Copyright 2016 tengxiang All Rights Reserved * @author tengxiang * @since 1.0 * @version 1.0 */ public abstract class HummerModel { //发动 protected abstract void start(); //停车 protected abstract void stop(); //喇叭 protected abstract void alarm(); //引擎响 protected abstract void engineBoom(); /** * 跑 * @since 1.0 *
作者: @author tengxiang *
创建时间:2016年7月2日 下午11:10:29 */ final public void run(){ //发动 this.start(); //引擎轰鸣 this.engineBoom(); //喇叭想让它响就响,不想让它响就不响 if(this.isAlarm()){ this.alarm(); } //停车 this.stop(); } //钩子方法,默认喇叭会响 protected boolean isAlarm(){ return true; } }

run方法定义了调用其它方法的顺序,并且子类不能修改的,这个叫做模板方法startstopalarmengineBoom这四个方法是子类必须实现的,而且这四个方法的修改对应了不同的类,这个叫做基本方法,基本方法分为三种:在抽象类中实现了的基本方法叫做具体方法;在抽象类中没有实现,在子类中实现叫做抽象方法,我们这四个基本方法都是抽象方法,由子类来实现还有一种叫做钩子方法

 

增加的一个方法,isAlarm(),喇叭要不要,这就是钩子方法钩子方法模式是由抽象类来实现子类可以重写:

package com.teng.pattern.impl;

/**
 * 悍马2模型
 * 
创建日期:2016年7月2日 *
Copyright 2016 tengxiang All Rights Reserved * @author tengxiang * @since 1.0 * @version 1.0 */ public class HummerH2Model extends HummerModel { //是否要按喇叭 private boolean alarmFlag = true; @Override protected void start() { System.out.println("悍马H2发动。。。"); } @Override protected void stop() { System.out.println("悍马H2停车。。。"); } @Override protected void alarm() { System.out.println("悍马H2鸣笛。。。"); } @Override protected void engineBoom() { System.out.println("悍马H2引擎。。。"); } @Override protected boolean isAlarm(){ return this.alarmFlag; } /** * 要不要按喇叭,由客户决定 * @since 1.0 * @param isAlarm *
作者: @author tengxiang *
创建时间:2016年7月2日 下午11:31:50 */ public void setAlarm(boolean isAlarm){ this.alarmFlag = isAlarm; } }

客户使用

package com.teng.pattern.impl;

/**
 * 客户
 * 
创建日期:2016年7月2日 *
Copyright 2016 tengxiang All Rights Reserved * @author tengxiang * @since 1.0 * @version 1.0 */ public class Client { /** * 主方法 * @since 1.0 * @param args *
作者: @author tengxiang *
创建时间:2016年7月2日 下午11:36:12 */ public static void main(String[] args) { HummerH2Model h2 = new HummerH2Model(); h2.setAlarm(false); h2.run(); } }

总结一下模板模式,模板方法模式就是在模板方法中按照一个规则和顺序调用基本方法。

模板方法是通过汇总或排序基本方法产生的结果集。

 

重写了父类部分方法后,再调用从父类继承的方法,产生不同的结果(这正是模板方法模式)这是不是也可以理解父类调用了子类的方法呢修改了子类,影响了父类的结果,模板方法模式就是这样效果


你可能感兴趣的:(设计模式)