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

来源:互联网 发布:压缩软件for mac 编辑:程序博客网 时间:2024/06/05 00:32

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

package com.teng.pattern.impl;/** * 悍马抽象类,模板设计模式 * <br>创建日期:2016年7月2日 * <br><b>Copyright 2016 tengxiang All Rights Reserved</b> * @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 * <br><b>作者: @author tengxiang</b> * <br>创建时间: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模型 * <br>创建日期:2016年7月2日 * <br><b>Copyright 2016 tengxiang All Rights Reserved</b> * @author tengxiang * @since 1.0 * @version 1.0 */public class HummerH2Model extends HummerModel {//是否要按喇叭private boolean alarmFlag = true;@Overrideprotected void start() {System.out.println("悍马H2发动。。。");}@Overrideprotected void stop() {System.out.println("悍马H2停车。。。");}@Overrideprotected void alarm() {System.out.println("悍马H2鸣笛。。。");}@Overrideprotected void engineBoom() {System.out.println("悍马H2引擎。。。");}@Overrideprotected boolean isAlarm(){return this.alarmFlag;}/** * 要不要按喇叭,由客户决定 * @since 1.0 * @param isAlarm * <br><b>作者: @author tengxiang</b> * <br>创建时间:2016年7月2日 下午11:31:50 */public void setAlarm(boolean isAlarm){this.alarmFlag = isAlarm;}}

客户使用

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

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

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

 

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


0 0
原创粉丝点击