【问题标题】:Does the ThreadPoolExecutor Apply the Template Pattern?ThreadPoolExecutor 是否应用了模板模式?
【发布时间】:2018-06-04 16:22:32
【问题描述】:

ThreadPoolExecutor 中有 2 个挂钩方法

这个技术让我想到了模板方法模式,其中abstract类中有hook方法。但是,模板方法abstract类中的hook方法ThreadPoolExecutor的不同之处在于:

  • ThreadPoolExecutor 类是 concrete,而在 模板方法 模式中定义 hook 方法 的类是 abstract
  • hook 方法,例如beforeExecute(Thread t, Runnable r)afterExecute(Runnable r, Throwable t),在ThreadPoolExecutor 中是具体的,带有空的方法体,而hook 模板方法模式的abstract类中的方法abstract,尽管这两个挂钩方法都是protected,表明它们应该是@987654332 @ 在他们的子类

所以我的问题是:

  • ThreadPoolExecutor 是否属于 模板方法 模式
  • 本身就是 hook 方法模板方法模式中的独立技术

【问题讨论】:

    标签: java threadpoolexecutor template-method-pattern


    【解决方案1】:

    就个人而言,我会说是的,因为 ThreadPoolExecutor 预先定义了一组在子类化时无法更改的命令,因为它被标记为final。见#runWorker。 这是模板:第一个beforeExecute,第二个task.run,第三个afterExecute

    final void runWorker(Worker w) {
      // ... snip
         beforeExecute(wt, task);
         try {
               task.run();
         } 
         ...
         } finally {
            afterExecute(task, thrown);
         }
    
       // ... snip
    } 
    

    它将实现的某些部分留给子类beforeExecuteafterExecute

    但是是的,我知道可以进行讨论,因为在这种情况下,该类只有钩子(未标记为抽象,因此允许但不是必需的)来控制子类。

    【讨论】:

    • 非常感谢您的意见 :) 所以看来面向对象编程语言中的钩子方法不能独立于模板而存在方法,不是吗?
    • 当你从逻辑上考虑它时,创建一个没有最终模板方法的具有钩子的类是没有意义的,是的。
    • thanks :) 再次仔细阅读 gof23 后,我发现那里提到了钩子操作,这是默认方法,可以被覆盖。所以基于此我同意你的回答
    猜你喜欢
    • 1970-01-01
    • 2017-02-11
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多