设计模式-模板方法模式
目录
1.简单介绍
2.角色功能
3.代码实现
4.优缺点
1.简单介绍
- 模板方法模式(Template Method):定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤,属于行为型模式
- 应用场景:
- 有多个子类共有逻辑相同的方法,可以考虑作为模板方法
- 设计一个系统时知道了算法所需的关键步骤,且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,可以延迟到子类进行完成
2.角色功能
- 抽象模板(Abstract Template):定义一个模板方法,这个模板方法一般是一个具体方法,给出一个顶级算法骨架,而逻辑骨架的组成步骤在相应的抽象操作中,推迟到子类实现
- 基本方法:是整个算法中的一个步骤,包括抽象方法和具体方法
- 抽象方法:在抽象类中申明,由具体子类实现。
- 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它
- 具体模板(Concrete Template):实现父类所定义的一个或多个抽象方法,它们是一个顶级算法逻辑的组成步骤
3.代码实现
抽象模板
/*** 咸鱼反过来还是咸的~** @author: 会敲代码的小张* @date: 2024/9/12 10:15** 抽象模板*/
public abstract class AbstractProject {/*** 定义模板方法,声明final,防止子类覆盖他*/public final void processProject() {review();design();coding();test();online();}public void review() {System.out.println("项目需求评审~");}public void design() {System.out.println("项目需求设计~");}//抽象方法,由子类具体实现public abstract void coding();//抽象方法,由子类具体实现public abstract void test();//抽象方法,由子类具体实现public abstract void online();
}
具体模板
/*** 咸鱼反过来还是咸的~** @author: 会敲代码的小张* @date: 2024/9/12 10:20** 具体的模板~1实现父类定义的抽象方法*/
public class PayServiceProject extends AbstractProject{@Overridepublic void coding() {System.out.println("代码编写~一个月");}@Overridepublic void test() {System.out.println("功能测试,压力测试");}@Overridepublic void online() {System.out.println("全量上线");}
}/*** 咸鱼反过来还是咸的~** @author: 会敲代码的小张* @date: 2024/9/12 10:30* 具体的模板~2实现父类定义的抽象方法*/
public class UserServiceProject extends AbstractProject{@Overridepublic void coding() {System.out.println("代码编写~10天");}@Overridepublic void test() {System.out.println("功能测试");}@Overridepublic void online() {System.out.println("灰度发布");}
}
测试
/*** 咸鱼反过来还是咸的~** @author: 会敲代码的小张* @date: 2024/9/12 10:31*/
public class MyTest {public static void main(String[] args) {AbstractProject project;System.out.println("++++++++++++++++++支付模式测试++++++++++++++++++");project = new PayServiceProject();project.processProject();System.out.println("++++++++++++++++++用户模式测试++++++++++++++++++");project = new UserServiceProject();project.processProject();}
}
4.优缺点
- 优点:
- 扩展性好,对不变的代码进行封装,对可变的进行扩展,符合开闭原则
- 提高代码复用性 将相同部分的代码放在抽象的父类中,将不同的代码放入不同的子类中
- 通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制
- 缺点:
- 每一个不同的实现都需要一个子类来实现,导致类的个数增加,会使系统变得复杂