找回密码
 立即注册
首页 业界区 安全 18.行为型 - 模板方法模式(Template Method Pattern) ...

18.行为型 - 模板方法模式(Template Method Pattern)

梨恐 5 天前
模板方法模式(Template Method Pattern)

意图:定义一个操作中的算法(业务)的骨架, 而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法(业务)的结构即可重定义该算法的某些特定步骤.
主要解决:一些方法通用, 却在每一个子类都重新写了这一方法。
例如:
一个做饭的流程,  点火>烹饪>关火>洗锅
其中'点火'和'关火'是无论做什么菜流程都一样(通用)
而'烹饪'则是根据每种菜的做法而不同(延迟至子类实现)
'洗锅'则是可选的,  最后一道菜做完收锅(hook, )
关键点在于区分:

  • 哪些方法是通用的,  在父类实现
  • 哪些方法是不同的,  在父类抽象,  在子类中实现;
  • 哪些方法属于hook,  在父类实现,  在子类中可选的调用;
in short 抽象类实现大流程,  具体细节(抽象方法)给子类实现
UML类图

1.png

代码实例

1.抽象父类(做菜)
  1. public abstract class AbstractCook {
  2.         //做饭 统一的流程
  3.     public final void doCook(){
  4.         openFire();
  5.         cooking();
  6.         if(isFinal()){
  7.             doFinal();
  8.         }
  9.         closedFire();
  10.     }
  11.     //钩子方法
  12.     public boolean isFinal() {
  13.         return false;
  14.     }
  15.     public void doFinal() {
  16.           System.out.println("做完收锅!!");
  17.     }
  18.     protected abstract void cooking();
  19.        
  20.     protected void openFire() {
  21.         System.out.println("点火, 开始做菜了");
  22.     }
  23.     protected void closedFire() {
  24.         System.out.println("关火, 菜出锅了");
  25.     }
  26. }
复制代码
2.具体子类(小龙虾和炒饭)
  1. public class Crayfish extends AbstractCook {
  2.     @Override
  3.     protected void cooking() {
  4.         System.out.println("一份小龙虾!");
  5.     }
  6. }
  7. public class FryRice extends AbstractCook {
  8.     @Override
  9.     protected void cooking() {
  10.         System.out.println("一份炒饭!");
  11.     }
  12.         @Override
  13.     public boolean isFinal() {
  14.         return true;
  15.     }
  16. }
复制代码
模板方法模式(Template Method Pattern) 总结

模板方法模式优缺点

优点:

  • 在父类中形式化的定义一个算法, 而由它的子类来实现细节处理, 在子类实现详细的处理代码时, 并不会改变父类算法中步骤的执行顺序.
  • 模板方法可以实现一种反向的控制结构, 通过子类覆盖父类的钩子方法, 来决定某一个特定步骤是否需要执行
  • 在模板方法模式中可以通过子类来覆盖父类的基本方法, 不同的子类可以提供基本方法的不同实现, 更换和增加新的子类很方便, 符合单一职责原则和开闭原则.
缺点:

  • 对每个不同的实现都需要定义一个子类, 这会导致类的个数增加, 系统更加庞大, 设计也更加抽象。
  • 父类中的抽象方法由子类实现, 子类执行的结果会影响父类的结果, 这导致一种反向的控制结构, 它提高了代码阅读的难度。
模板方法模式适用场景


  • 多个类有相同的方法并且逻辑可以共用时;
  • 将通用的算法或固定流程设计为模板, 在每一个具体的子类中再继续优化算法步骤或流程步骤时;
  • 重构超长代码时, 发现某一个经常使用的公有方法。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册