模板方法模式

来源:互联网 发布:tensorflow things 编辑:程序博客网 时间:2024/05/22 00:10

一、定义:
定义一个操作中的算法的框架, 而将一些步骤延迟到子类中。 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
二、类图:
这里写图片描述
AbstractClass叫做抽象模板, 它的方法分为两类:
● 基本方法
基本方法也叫做基本操作, 是由子类实现的方法, 并且在模板方法被调用。
● 模板方法可以有一个或几个, 一般是一个具体方法, 也就是一个框架, 实现对基本方法的调度,完成固定的逻辑。
注意: 为了防止恶意的操作, 一般模板方法都加上final关键字, 不允许被覆写。
ConcreteClass1和ConcreteClass2属于具体模板, 实现父类所定义的一个或多个抽象方法, 也就是父类定义的基本方法在子类中得以实现。
三、代码:
HummerModel.class

/** * 抽象模板类,定义一个操作的算法的框架,而将一些步骤延迟到子类中。 */public abstract class HummerModel {    protected void start(){}//基本方法,启动    protected void engineBoom(){}//基本方法,引擎声响    protected void alarm(){}//基本方法,喇叭声响    protected void stop(){}//基本方法,停止    protected boolean isAlarm(){//基本方法,钩子方法,子类可以通过重写该方法控制引擎启动后是否有喇叭声响        return true;//默认引擎启动后有喇叭声响    }    final public void run(){//模板方法,调用基本方法,完成固定的操作步骤。final 关键字不允许子类复写该方法。        this.start();        this.engineBoom();        if (this.isAlarm()) this.alarm();        this.stop();    }}

HummerH1.class

/** * 具体模板,实现抽象模板中的基本方法 */public class HummerH1 extends HummerModel{    @Override    protected void start() {        super.start();        System.out.println("悍马H1启动...");    }    @Override    protected void engineBoom() {        super.engineBoom();        System.out.println("悍马H1引擎轰鸣...");    }    @Override    protected void alarm() {        super.alarm();        System.out.println("悍马H1喇叭声响...");    }    @Override    protected void stop() {        super.stop();        System.out.println("悍马车H2停止...");    }}

HummerH2.class

/** * 具体模板,实现抽象模板中的基本方法 */public class HummerH2 extends HummerModel{    @Override    protected void start() {        super.start();        System.out.println("悍马H2启动...");    }    @Override    protected void engineBoom() {        super.engineBoom();        System.out.println("悍马H2引擎轰鸣...");    }    @Override    protected void alarm() {        super.alarm();        System.out.println("悍马H2喇叭声响...");    }    @Override    protected void stop() {        super.stop();        System.out.println("悍马车H2停止...");    }    @Override    protected boolean isAlarm() {        return false;//H2引擎启动后没有喇叭鸣响    }}

Client.class

/** * 场景类 */public class Client {    public static void main(String[] args) {        // TODO Auto-generated method stub        HummerModel model1=new HummerH1();        model1.run();//HummerH1实例运行        System.out.print("\n");        HummerModel model2=new HummerH2();        model2.run();//HummerH2实例运行    }}

运行结果:
这里写图片描述
四、优点:
● 封装不变部分, 扩展可变部分
把认为是不变部分的算法封装到父类实现, 而可变部分的则可以通过继承来继续扩展。
● 提取公共部分代码, 便于维护
● 行为由父类控制, 子类实现
基本方法是由子类实现的, 因此子类可以通过扩展的方式增加相应的功能, 符合开闭原则。
五、缺点:
按照我们的设计习惯, 抽象类负责声明最抽象、 最一般的事物属性和方法, 实现类完成具体的事物属性和方法。 但是模板方法模式却颠倒了, 抽象类定义了部分抽象方法, 由子类实现, 子类执行的结果影响了父类的结果, 也就是子类对父类产生了影响, 这在复杂的项目中, 会带来代码阅读的难度, 而且也会让新手产生不适感。
六、应用场景:
● 多个子类有公有的方法, 并且逻辑基本相同时。
● 重要、 复杂的算法, 可以把核心算法设计为模板方法, 周边的相关细节功能则由各个子类实现。
● 重构时, 模板方法模式是一个经常使用的模式, 把相同的代码抽取到父类中, 然后通过钩子函数约束其行为。

0 0
原创粉丝点击