模板模式
基本介绍
1.在一个抽象类公开定义了执行它的方法的模板,子类重写抽象方法,调用将以抽象类中定义的方式进行
2.作用:将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
角色
1.AbstractClass:抽象类 / 接口,定义了算法的骨架
2.ConcreteClass:实现抽象方法,以完成算法中特定子类的具体业务步骤,该子类可以有多个
Abstract 的方法种类
1.模板方法 / 骨架方法
(1)定义了整个方法需要实现的业务操作的骨架
(2)其中调用了具体方法、钩子方法、抽象方法,根据实际情况增加其他逻辑或条件
(3)可以是一个抽象方法要求子类自行定义逻辑流程,或者用 final 修饰不让子类重写
2.具体方法
(1)一个骨架中,有可能有一些逻辑是确定不变的,这个时候可以直接在父类中定义完全的已实现的方法,无需子类再进行覆盖
3.抽象方法
(1)一个普通的抽象方法,由子类重写实现,增强了模板方法的灵活性
4.钩子方法
(1)钩子是一种被声明在抽象类中的方法,不是由该方法的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应
(2)钩子方法可以让子类实现算法中可选的部分,让子类能够有机会对模板方法中某些一即将发生的步骤做出反应,子类可以视情况是否重写钩子方法,来设置算法步骤的某一步骤是否要执行
(3)通常返回一个 boolean 类型,用来判断是否执行某一个基本方法
(4)方式一:空方法
(5)方式二:定义一个默认的实现,如果子类不覆盖钩子方法,则执行父类的默认实现代码
事项
1.优点
(1)封装不变部分,扩展可变部分
(2)提取公共代码,便于维护
(3)行为由父类控制,子类实现
2.缺点
(1)每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大
3.使用场景
(1)有多个子类共有的方法,且逻辑相同
(2)重要的、复杂的方法,可以考虑作为模板方法
代码示例
public class Template {//客户端
public static void main(String[] args) {
ConcreteClass1 concreteClass1 = new ConcreteClass1();
ConcreteClass2 concreteClass2 = new ConcreteClass2();
concreteClass1.template();
concreteClass2.template();
}
}
abstract class AbstractClass {//抽象类
final void template() {
step1();
step2();
if (hook1()) {
step3();
}
hook2();
}
public void step1() {
System.out.println("具体方法实现步骤 1");
}
public abstract void step2();
public void step3() {
System.out.println("具体方法实现步骤 3");
}
public boolean hook1() {
return true;
}
public void hook2() {
}
}
class ConcreteClass1 extends AbstractClass {//子类1
@Override
public void step2() {
System.out.println("子类 1 实现步骤 2");
}
@Override
public boolean hook1() {
System.out.println("子类 1 利用 hook1 跳过步骤 3");
return false;
}
}
class ConcreteClass2 extends AbstractClass {//子类2
@Override
public void step2() {
System.out.println("子类 2 实现步骤 2");
}
@Override
public void hook2() {
System.out.println("子类 2 利用 hook2 实现步骤 4");
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战