今天把我之前写的这些博客让技术大牛看了下,给我提了很多建议。如一个技术的原理及知识,优缺点,使用场景等问题我都没有表述清楚。谢谢大牛的指点,今后也会牢记在心。废话不多说开始我今天的学习之旅。
接着抽象工厂模式的故事继续延伸,客户让工厂生产一批不同品牌的汽车,交给用户去使用。但没一家工厂不可能生产出100%没有问题的汽车,所以我们要对生产出来的汽车进行检验确保没有问题的情况下在交给用户去使用。但客户自己去检验不同品牌的车辆是不是需要懂每辆车品牌的特性,怎样才算符合标准同时费事费时。如果我们定好每个品牌的符合标准交给模板方法去执行,这样可以减少验车的成本和符合度。
代码清单:MINI检验标准
public class MINICarModel extends CarModel{
//汽车发动
public void start(){
System.out.println("MINI汽车启动");
}
//鸣笛
public void bibi(){
System.out.println("MINI汽车鸣笛");
}
//汽车停止
public void stop(){
System.out.println("MINI汽车停止");
}
}
代码清单:宝马检验标准
public class BMWCarModel extends CarModel{
//汽车发动
public void start(){
System.out.println("宝马汽车启动");
}
//开空调
public void air(){
System.out.println("宝马汽车开空调");
}
//鸣笛
public void bibi(){
System.out.println("宝马汽车鸣笛");
}
//汽车停止
public void stop(){
System.out.println("宝马汽车停止");
}
}
代码清单:汽车抽象模板
public abstract class CarModel {
//汽车发动
public abstract void start();
//开空调
public void air(){};
//鸣笛
public abstract void bibi();
//汽车停止
public abstract void stop();
//跑一圈
public void run(){
//发动汽车
this.start();
//开空调
this.air();
//汽车鸣笛
this.bibi();
//汽车停止
this.stop();
}
}
代码清单:检验标准都已经建立完成,我们让车跑一圈试试
public class TestCarModel {
public static void main(String[] args) {
CarModel bcarModel = new BMWCarModel();
bcarModel.run();
System.out.println("--------------------");
CarModel mcarModel = new MINICarModel();
mcarModel.run();
}
}
跑完后的结果
宝马汽车启动
宝马汽车开空调
宝马汽车鸣笛
宝马汽车停止
--------------------
MINI汽车启动
MINI汽车鸣笛
MINI汽车停止
模板方法模式如此简单,以致让你感觉已经能掌握其精髓。我们来看下他原理、优缺点
模板方法模式原理
模板方法确实非常简单,仅仅使用了java的继承机制,但他是一个应用非常广泛的模式,其中AbstractClass抽象模板,它的方法分为两类
- 基本方法:基本方法也叫做基本操作,是有子类实现的方法,并且在模板方法被调用。
- 模板方法:可以有一个或几个,一般是一个具体的方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。
模板方法模式优缺点
优点
- 封装不变部分,扩展可变部分
- 提取公共代码,便于维护
- 行为由父类控制,子类实现
缺点
- 抽象类定义了部分抽象方法,由子类实现,子类执行的结果影响了父类的结果,也就是子类对父类产生了影响,在复杂的项目中,会带来代码阅读的难度,而且也会让新手产生不适感。
模板方法模式的使用场景
- 多个子类有公有的方法,并且逻辑基本相同。
- 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
- 重构時,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。