一、模板方法设计模式简介
模板方法模式(Template Method)
- 定义⼀个操作中的算法⻣架,将算法的⼀些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤,属于行为型模式
应用创景
- javaweb⾥⾯的Servlet,HttpService类提供了⼀个 service()⽅法
- 有多个⼦类共有逻辑相同的⽅法,可以考虑作为模板⽅法
- 设计⼀个系统时知道了算法所需的关键步骤,且确定了这些步骤的执⾏顺序,但某些步骤的具体实现还未知, 可以延迟到子类进⾏完成
角色
- 抽象模板(Abstract Template): 定义⼀个模板⽅法,这 个模板⽅法⼀般是⼀个具体⽅法,给出⼀个顶级算法骨架,⽽逻辑骨架的组成步骤在相应的抽象操作中,推迟到⼦类实现
- 模板⽅法:定义了算法的骨架,按某种顺序调⽤其 包含的基本⽅法
- 基本⽅法:是整个算法中的⼀个步骤,包括抽象⽅法和具体⽅
- 抽象⽅法:在抽象类中申明,由具体⼦类实现。
- 具体⽅法:在抽象类中已经实现,在具体⼦类中 可以继承或重写它
- 具体模板(Concrete Template):实现⽗类所定义的⼀个或多个抽象⽅法,它们是⼀个顶级算法逻辑的组成步骤
模板方法模式和建造者模式区别
- 两者很⼤的交集,建造者模式⽐模板方法模式多了⼀个指挥类, 该类体现的是模板⽅法模式中抽象类的固定算法的功能,是⼀个创建对象的固定算法
二、优缺点
优点:
- 扩展性好,对不变的代码进⾏封装,对可变的进⾏扩展,符合开闭原则
- 提⾼代码复⽤性 将相同部分的代码放在抽象的⽗类中,将不同的代码放⼊不同的⼦类中 通过⼀个⽗类调⽤其⼦类的操作
- 通过对⼦类的具体实现扩展不同的⾏为,实现了反向控制
缺点:
- 每⼀个不同的实现都需要⼀个⼦类来实现,导致类的个数增加,会使系统变得复杂
三、代码实现
/**
*抽象模板
**/
public abstract class AbstractProjectManager {
/**
* 定义模板方法,声明final,防止子类覆盖他,更改顺序,流程是一样复用
*/
public final void processProject(){
review();
degisn();
coding();
test();
online();
}
/**
* 各个项目都需要评审,具体方法
*/
public void review(){
System.out.println("项目需求评审");
}
/**
* 各个项目都需要设计,具体方法
*/
public void degisn(){
System.out.println("UI UE进行设计");
}
/**
* 抽象方法,由就具体子类进行实现,编码耗时不一样
*/
public abstract void coding();
/**
* 抽象方法,由就具体子类进行实现,测试有多种,自动化测试、安全测试、压力测试、手工测试
*/
public abstract void test();
/**
* 抽象方法,由就具体子类进行实现,上线有全量发布,灰度发布,停机发布
*/
public abstract void online();
}
/**
*具体实现
**/
public class PayServiceProjectManager extends AbstractProjectManager {
@Override
public void coding() {
System.out.println("开发耗时30天");
}
@Override
public void test() {
System.out.println("功能测试,安全测试,压力测试");
}
@Override
public void online() {
System.out.println("全量上线");
}
}
/**
*具体实现
**/
public class UserServiceProjectManager extends AbstractProjectManager {
@Override
public void coding() {
System.out.println("开发耗时10天");
}
@Override
public void test() {
System.out.println("功能测试,压力测试,还有手工测试");
}
@Override
public void online() {
System.out.println("灰度发布,全量上线");
}
}
public class Main {
public static void main(String[] args) {
PayServiceProjectManager payServiceProjectManager = new PayServiceProjectManager();
payServiceProjectManager.processProject();
UserServiceProjectManager userServiceProjectManager = new UserServiceProjectManager();
userServiceProjectManager.processProject();
}
}
注释:个人学习观点以作笔记,如有瑕疵望谅解