文章目录
- 思考模板模式
- 1.模板模式的本质
- 2.何时选用模板模式
- 3.优缺点
- 4.模板方法的结构
- 5.实现
思考模板模式
模板模式其实就是抽离共用方法到抽象类中,然后再规定其具体实现步骤
1.模板模式的本质
模板方法模式的本质:固定算法骨架。
模板方法模式主要是通过制定模板,把算法步骤固定下来,至于谁来实现,模板可以自己提供实现,也可以由子类去实现,还可以通过回调机制让其他类来实现。
通过固定算法骨架来约束子类的行为,并在特定的扩展点来让子类进行功能扩展,从而让程序既有很好的复用性,又有较好的扩展性。
2.何时选用模板模式
建议在以下情况中选用模板方法模式。
- 需要固定定义算法骨架,实现一个算法的不变的部分,并把可变的行为留给子类来实现的情况。
- 各个子类中具有公共行为,应该抽取出来,集中在一个公共类中去实现,从而避免代码重复。
- 需要控制子类扩展的情况。模板方法模式会在特定的点来调用子类的方法,这样只允许在这些点进行扩展。
3.优缺点
优点
-
模板方法模式的优点是实现代码复用。
模板方法模式是一种实现代码复用的很好的手段。通过把子类的公共功能提炼和抽取,把公共部分放到模板中去实现。 -
模板方法模式的缺点是算法骨架不容易升级。
模板方法模式最基本的功能就是通过模板的制定,把算法骨架完全固定下来。事实上模板和子类是非常耦合的,如果要对模板中的算法骨架进行变更,可能就会要求所有相关的子类进行相应的变化。所以抽取算法骨架的时候要特别小心,尽量确保是不会变化的部分才放到模板中。
4.模板方法的结构
- AbstractClass:抽象类。用来定义算法骨架和原语操作,具体的子类通过重定义这些原语操作来实现一个算法的各个步骤。在这个类里面,还可以提供算法中通用的实现。
- ConcreteClass:具体实现类。用来实现算法骨架中的某些步骤,完成与特定子类相关的功能。
原语操作:即是抽象的操作,必须由子类提供实现
钩子操作:即是在模板中定义,并提供默认实现的操作,子类可以选择性重写
5.实现
定义一个oppo手机模板类,所有机型都使用的是oppo电池,但是使用的芯片不同,所以电池方法在模板类实现,芯片方法各个机型实现自己的。
模板及其实现类,模板方法设置为 final,防止被恶意重写
/**
* @description:手机模板类
*/
public abstract class Phone {
/**
* 钩子操作
* 安装电池
*/
void initBattery(){
System.out.println("安装oppo电池");
}
/**
* 原语操作
* 安装处理器
*/
abstract void initProcessor();
/**
* 初始化手机
*/
public final void init(){
initBattery();
initProcessor();
}
}
/**
* @description:OppoReno9 机型手机
*/
public class OppoReno9 extends Phone{
@Override
void initProcessor() {
System.out.println("使用高通骁龙778G处理器");
}
}
/**
* @description:OppoReno9Pro 机型手机
*/
public class OppoReno9Pro extends Phone {
@Override
void initProcessor() {
System.out.println("使用天玑 8100-MAX处理器");
}
}
测试类
/**
* @description:测试类
*/
public class Client {
public static void main(String[] args) {
Phone oppoReno9 = new OppoReno9();
oppoReno9.init();
Phone OppoReno9Pro = new OppoReno9Pro();
oppoReno9.init();
}
}
结果
安装oppo电池
使用高通骁龙778G处理器
安装oppo电池
使用高通骁龙778G处理器