设计模式11 - 设计模式 - 模板设计模式(高频-行为型)
一、定义
使用模板方法模式可以将代码的公共行为提取,以达到复用的目的。而对于特殊化的行为在子类中实现。父类的模板方法可以控制子类中的具体实现。子类无需了解整体算法框架,只需实现自己的业务逻辑即可。
二、实现方式
模板方法模式中的三类角色
1、具体方法(Concrete Method)
2、抽象方法(Abstract Method)
3、钩子方法(Hook Method)
首先父类会定义一个算法的框架,即实现算法所必须的所有方法。其中,具有共性的代码放在父类的具体方法中。各个子类特殊性的代码放在子类的具体方法中。但是父类中需要有对应抽象方法声明。钩子方法可以让子类决定是否对算法的不同点进行挂钩(实现)。
模板类:
1 /** 2 * 模板类 3 */ 4 public abstract class AbstractTemplete { 5 public void templeteMethod(){ 6 System.out.println("通用步骤1"); 7 //抽象方法 - 子类方法1 8 indivMethod1(); 9 //钩子方法,子类决定是否需要执行方法2 10 if (hook()){ 11 indivMethod2(); // 抽象方法 - 子类方法2 12 } 13 //通用步骤3 14 System.out.println("通用步骤3"); 15 } 16 17 18 // 个性化操作,在子类中具体实现 19 public abstract void indivMethod1(); 20 21 // 个性化操作,在子类中具体实现 22 public abstract void indivMethod2(); 23 24 //钩子方法,决定子类需不需要执行 25 public abstract boolean hook(); 26 27 }
子类1:
public class Indiv01 extends AbstractTemplete{ @Override public void indivMethod1() { System.out.println("子类1 - 个性化操作1"); } @Override public void indivMethod2() { System.out.println("子类1 - 个性化操作2"); } @Override public boolean hook() { return false; } }
子类2:
public class Indiv02 extends AbstractTemplete{ @Override public void indivMethod1() { System.out.println("子类2 - 个性化操作1"); } @Override public void indivMethod2() { System.out.println("子类2 - 个性化操作2"); } /**
* 钩子方法
**/
@Override public boolean hook() { return true; } }
执行类:
public static void main(String[] args) { Indiv01 indiv01 = new Indiv01(); Indiv02 indiv02 = new Indiv02(); indiv01.templeteMethod(); System.out.println("-------------------"); indiv02.templeteMethod(); }
结果:
通用步骤1
子类1 - 个性化操作1
通用步骤3
-------------------
通用步骤1
子类2 - 个性化操作1
子类2 - 个性化操作2
通用步骤3
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通