设计模式之模板方法模式

来源:互联网 发布:企业网站源码带手机版 编辑:程序博客网 时间:2024/06/05 05:24
  • 小思绪:设计模式讲究的就是一个平衡,应用架构讲究的也是平衡。

有如下两个类

//BMWCarpublic class BMWCar {    public void start(){        System.out.println("宝马车启动!");    }    public void stop(){        System.out.println("宝马车停止");    }    public void alarm(){        System.out.println("宝马车响喇叭");    }    public void run(){        this.start();        this.alarm();        this.stop();    }}//BenzCarpublic class BenzCar {    public void start(){        System.out.println("奔驰车启动!");    }    public void stop(){        System.out.println("奔驰车停止");    }    public void alarm(){        System.out.println("奔驰车响喇叭");    }    public void run(){        this.start();        this.alarm();        this.stop();    }}

我们发现上面两个类中run()方法存在重复,我们可以把重复代码抽取出来,于是引入模板方法模式:

模板方法

首先我们在实现需求的时候,发现子类有重复的代码,而且这个代码都是一个标准流程。这个时候我们引入模板方法设计模式,然后重复的部分抽象到父类中。

模板方法的优点
1. 模板方法是为了封装不变,扩展可变部分
2. 提取公共部分,便于代码的维护
3. 行为由父类控制,子类实现

定义一个抽象的父类Car,BenzCar和BMWCar都去继承Car

public abstract class Car {    protected abstract void start();    protected abstract void stop();    protected abstract void alarm();    public final void run(){        this.alarm();        this.start();        this.stop();    }}
  • 上述代码中,用final修饰run()方法,阻止子类覆盖run()方法,保证行为由父类Car控制。
public class BMWCar extends Car{    protected void start(){        System.out.println("宝马车启动!");    }    protected void stop(){        System.out.println("宝马车停止");    }    protected void alarm(){        System.out.println("宝马车响喇叭");    }}
public class BenzCar extends Car{    protected void start(){        System.out.println("奔驰车启动!");    }    protected void stop(){        System.out.println("奔驰车停止");    }    protected void alarm(){        System.out.println("奔驰车响喇叭");    }}
  • protected修饰start()、stop()、alarm()三个方法,阻止在不同包中的客户端Client自己去调用它们。Car bmwCar = new BMWCar(); bmwCar.start();//这种调用方式就被阻止了
    Client:
public class Client {    public static void main(String[] args) {        Car bmwCar = new BMWCar();        bmwCar.run();        Car benzCar = new BenzCar();        benzCar.run();    }}
0 0