模板方法模式(Template)

[复制链接]
发表于 2025-11-2 22:47:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、模板方法的界说:
在操纵中界说业务逻辑框架,包罗业务逻辑的方法就是模板方法,模板方法答应子类在不改变原有业务逻辑的流程下,对某些步调举行扩展和修改;
是一种基于继承的代码复用技能,是一种类运动模式(基于类的,继承关系的,也就是在模板方法模式中,只存在子类和父类的关系),通过继承来复用和扩展父类的功能;重要就是用来进步步伐代码的复用性和扩展性的;
Template方法也可以明白为钩子函数和回调函数(hook);
二、UML

三、实现
1、抽象模板
  1. package com.zhucl.templates;
  2. /**
  3. * 案例:模拟把大象(或其他)装进冰箱
  4. * <p>
  5. * 抽象的模板类
  6. */
  7. public abstract class AbstractTemplate {
  8.     //冰箱门是否开启,默认关闭
  9.     protected boolean doorIsOpen = false;
  10.     void openFridgeDoor() {
  11.         System.out.println("打开冰箱门~");
  12.         doorIsOpen = true;
  13.     }
  14.     abstract void putSomethingOn(String key);
  15.     void closedFridgeDoor() {
  16.         System.out.println("关上冰箱门~");
  17.         doorIsOpen = true;
  18.     }
  19.     void template(String something) {
  20.         //开始进行把东西装进冰箱的动作,如果东西不为null,则打开冰箱门,把东西装进去,最后关闭冰箱门
  21.         System.out.println("开始进行把东西装进冰箱的动作~");
  22.         if (something != null) {
  23.             openFridgeDoor();
  24.             putSomethingOn(something);
  25.         }
  26.         if (!this.doorIsOpen) {
  27.             closedFridgeDoor();
  28.         }
  29.         System.out.println("冰箱门是否开启:" + doorIsOpen);
  30.     }
  31. }
复制代码
2、详细实现
  1. package com.zhucl.templates;
  2. /**
  3. * 把肉装进冰箱的具体实现
  4. */
  5. public class ConcreteMeatsTemplate extends AbstractTemplate {
  6.     @Override
  7.     void putSomethingOn(String meats) {
  8.         System.out.println("把肉装进冰箱~" + meats);
  9.     }
  10. }
复制代码
  1. package com.zhucl.templates;
  2. public class ConcreteMilkTemplate extends AbstractTemplate {
  3.     @Override
  4.     void putSomethingOn(String key) {
  5.         System.out.println("把奶装进冰箱~" + key);
  6.     }
  7. }
复制代码
  1. package com.zhucl.templates;
  2. public class ConcreteEggsTemplate extends AbstractTemplate {
  3.     @Override
  4.     void putSomethingOn(String key) {
  5.         System.out.println("把蛋装进冰箱~" + key);
  6.     }
  7. }
复制代码
3、客户端调用
  1. package com.zhucl.templates;
  2. /**
  3. * 客户端调用
  4. */
  5. public class TemplateClient {
  6.     public static void main(String[] args) {
  7.         AbstractTemplate t1 = new ConcreteMeatsTemplate();
  8.         t1.template("菲力");
  9.         System.out.println("t1的冰箱门是否关闭:" + t1.doorIsOpen);
  10.         System.out.println("====================");
  11.         AbstractTemplate t2 = new ConcreteMilkTemplate();
  12.         t2.template("安佳牛奶");
  13.         System.out.println("t2的冰箱门是否关闭:" + t2.doorIsOpen);
  14.         System.out.println("====================");
  15.         AbstractTemplate t3 = new ConcreteEggsTemplate();
  16.         t3.putSomethingOn("可生食鸡蛋");
  17.         System.out.println("t3的冰箱门是否关闭:" + t3.doorIsOpen);
  18.     }
  19. }
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表