- 小思绪:设计模式讲究的就是一个平衡,应用架构讲究的也是平衡。
有如下两个类
//BMWCar
public 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();
}
}
//BenzCar
public 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();
}
}