模板方法模式
定义
Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template
Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s
structure.(定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改
变一个算法的结构即可重定义该算法的某些特定步骤。)
应用场景
当多个子类具有公共的步骤方法,且这些方法的执行逻辑和顺序大致相同时,我们可以在抽象类中进行主体方法的实现,并将基础方法延伸到子类中实现。当我们要启动一台计算机时,基本的一些步骤可以分为通电、主板通电、CPU通电、GPU通电……等等,虽然不同的主机执行时的具体步骤不同,例如游戏主机在主板通电时会启动水冷装置,而办公主机在主板通电时则会启动散热风扇,但是他们的主题流程却是非常相近的,只是一些特定的步骤需要个性化、定制化。
这时就能使用模板方法模式在抽象类中定义基础方法,并通过调用这些方法实现模板方法。从而达到封装不变部分、开放可扩展部分。在使用模板方法模式时,可通过增加子类来扩展功能,而子类有不可修改抽象类中定义的模板方法,符合开闭原则。
代码示例
/**
* @author 谢仲东 2018/8/8 22:09
* Description:
*/
public class TemplateMethodImpl {
public static void main(String[] args) {
GameComputer gc = new GameComputer();
WorkComputer wc = new WorkComputer();
System.out.println("====== 游戏主机启动 =====");
gc.startup();
System.out.println("====== 办公主机启动 =====");
wc.startup();
/*
output:
====== 游戏主机启动 =====
游戏主机电源通电,电压300W
游戏主机主板通电,启动水冷设备
游戏主机CPU通电,标频2.2Hz,睿频4.4Hz
游戏主机CPU通电,独立显卡,显存6G
====== 办公主机启动 =====
办公主机电源通电,电压150W
办公主机主板通电,启动15w散热风扇
办公主机CPU通电,标频1.8Hz,睿频3.8Hz
办公主机CPU通电,集成显卡,显存1G
抽象类中的powerOn() motherboardStartup() CPUStartup() GPUStartup() 为基础方法,有实现类实现其内部逻辑
抽象类中的startup方法为模板方法,负责调度基础方法的执行逻辑
*/
}
}
abstract class AbstractComputer{
//接通电源
abstract protected void powerOn();
//主板启动
abstract protected void motherboardStartup();
//CPU启动
abstract protected void CPUStartup();
//GPU启动
abstract protected void GPUStartup();
//启动主机
public final void startup() {
this.powerOn();
this.motherboardStartup();
this.CPUStartup();
this.GPUStartup();
}
}
class GameComputer extends AbstractComputer{
@Override
protected void powerOn() {
System.out.println("游戏主机电源通电,电压300W");
}
@Override
protected void motherboardStartup() {
System.out.println("游戏主机主板通电,启动水冷设备");
}
@Override
protected void CPUStartup() {
System.out.println("游戏主机CPU通电,标频2.2Hz,睿频4.4Hz");
}
@Override
protected void GPUStartup() {
System.out.println("游戏主机CPU通电,独立显卡,显存6G");
}
}
class WorkComputer extends AbstractComputer{
@Override
protected void powerOn() {
System.out.println("办公主机电源通电,电压150W");
}
@Override
protected void motherboardStartup() {
System.out.println("办公主机主板通电,启动15w散热风扇");
}
@Override
protected void CPUStartup() {
System.out.println("办公主机CPU通电,标频1.8Hz,睿频3.8Hz");
}
@Override
protected void GPUStartup() {
System.out.println("办公主机CPU通电,集成显卡,显存1G");
}
}