一:什么是模板方法模式
在模板模式(Template Pattern)中,抽象类公开定义了执行它的方法的方式/模板。子类可以按需重写方法实现,但调用将以抽象类中定义的公开方法进行。这种类型的设计模式属于行为型模式。
二:进一步了解模板方法模式
目的:
(抽象类中)定义一个操作骨架(方法),将一些步骤延迟到子类中(实现重写)。
模板方法使得子类可以不改变父类中的方法结构 即可重定义该算法的某些特定步骤(就是重写)。
主要解决:
一些方法通用,却在每一个子类都重新写了这一方法。
何时使用:
有一些通用的方法。
(比如去医院,要挂号、排队、检查、缴费,这些同样的步骤就可以在抽象类中用方法统一实现)
如何解决:
将这些通用算法抽象出来。
关键代码:
在抽象类实现,其他步骤在子类实现。
优点:
1、封装不变部分,扩展可变部分。
2、提取公共代码,便于维护。
3、行为由父类控制,子类实现。
缺点:
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。
三:实现
场景,去医院看病流程
挂号、排队、检查、缴费
医院流程 抽象类
//医院流程 抽象类
public abstract class Hospital {
//挂号
abstract void register();
//排队
abstract void lineUp();
//检查
abstract void inspect();
//缴费
abstract void pay();
//任何医院流程的通用方法
public final void goToHospital(){
register();
lineUp();
inspect();
pay();
}
}
抽象类的实现
//抽象类的实现
public class ShantouHospital extends Hospital {
@Override
void register() {
System.out.println("在汕头医院进行挂号...");
}
@Override
void lineUp() {
System.out.println("在汕头医院进行排队...");
}
@Override
void inspect() {
System.out.println("在汕头医院进行检查...");
}
@Override
void pay() {
System.out.println("在汕头医院进行缴费...");
}
}
抽象类的实现
//抽象类的实现
public class ShenzhenHospital extends Hospital {
@Override
void register() {
System.out.println("在深圳医院进行挂号...");
}
@Override
void lineUp() {
System.out.println("在深圳医院进行排队...");
}
@Override
void inspect() {
System.out.println("在深圳医院进行检查...");
}
@Override
void pay() {
System.out.println("在深圳医院进行缴费...");
}
}
测试类
public class Test {
public static void main(String[] args) {
ShantouHospital shantouHospital = new ShantouHospital();
shantouHospital.goToHospital();
System.out.println("============================");
ShenzhenHospital shenzhenHospital = new ShenzhenHospital();
shenzhenHospital.goToHospital();
}
}
执行结果: