设计模式——模板方法模式
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类不改变算法结构即可冲定义该算法的某些特定步骤。
模板方法模式介绍
也许看定义有些懵逼,但是模板方法模式在设计模式中算是简单的了,仅仅使用了Java的继承机制。但是它的应用是非常广泛的。我们先举个简单的例子让大家对于模板方法模式有个直观的了解。
里面有两个角色
- 抽象模板角色:完成对于基本方法的封装,由子类实现。并有一个方法是模板方法对于基本方法的调用,完成固定的逻辑。
- 具体模板角色:子类对于基本方法的完善,从而实现父类调用子类方法实现不同角色不同的内容。
例如我们定义个抽象的汽车类,里面有汽车启动、停止、喇叭三个操作。但是每个汽车的这三个操作都是不同的。但是向客户演示的时候都是同样操作启动、停止、按喇叭。所以这就是一个典型的模板方法模式。
abstract class AbstractCar{
protected abstract void run();
protected abstract void stop();
protected abstract void alarm();
public final void templateMethod(){
run();
stop();
alarm();
}
}
接下来定义两辆实际的汽车
class BmwCar extends AbstractCar{
@Override
protected void run() {
System.out.println("宝马 跑");
}
@Override
protected void stop() {
System.out.println("宝马 停");
}
@Override
protected void alarm() {
System.out.println("宝马 喇叭叫");
}
}
class HmCar extends AbstractCar{
@Override
protected void run() {
System.out.println("悍马 跑");
}
@Override
protected void stop() {
System.out.println("悍马 停");
}
@Override
protected void alarm() {
System.out.println("悍马 喇叭叫");
}
}
所以在调用的时候根据不同的车创建不同的角色即可
AbstractCar bmw = new BmwCar();
bmw.templateMethod();
AbstractCar hm = new HmCar();
hm.templateMethod();
抽象模板中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露的属性或者方法尽量设置为protected类型。
模板方法模式的优点
- 封装不变部分,扩展可变部分:把认为不变部分的算法封装到父类实现,而可变部分的则可以通过继承来继续扩展。
- 提取公共部分代码,便于维护:如果不将公共部分抽取到父类中,任由散乱分布,最后维护将会造成很大的困扰。
- 行为由父类控制,子类实现:基本方法由子类实现,因此子类可以通过扩展的方式增加相应的功能。