Java ThreadPoolExecutor是否应用模板模式?
中有两种钩子方法 这种技术让我想到了模板方法模式,在Java ThreadPoolExecutor是否应用模板模式?,java,threadpoolexecutor,template-method-pattern,Java,Threadpoolexecutor,Template Method Pattern,中有两种钩子方法 这种技术让我想到了模板方法模式,在抽象类中有hook方法。但是,template method的抽象类中的钩子方法与ThreadPoolExecutor的不同之处在于: ThreadPoolExecutor类是具体的,而在模板方法模式中定义钩子方法的类是抽象的 在ThreadPoolExecutor中,诸如beforeExecute(线程t,可运行r)和afterExecute(可运行r,可丢弃t)等钩子方法是具体的,方法体为空,而模板方法模式的abstract类中的钩子方法
抽象类中有hook方法。但是,template method的抽象类中的钩子方法与ThreadPoolExecutor的不同之处在于:
ThreadPoolExecutor
类是具体的,而在模板方法模式中定义钩子方法的类是抽象的
- 在
ThreadPoolExecutor
中,诸如beforeExecute(线程t,可运行r)
和afterExecute(可运行r,可丢弃t)
等钩子方法是具体的,方法体为空,而模板方法模式的abstract
类中的钩子方法是abstract
,尽管事实上这两个钩子方法都是受保护的
,这表明它们应该在其子类中被覆盖
因此,我的问题是:
- ThreadPoolExecutor
是否属于模板方法模式
就个人而言,我会说是,因为ThreadPoolExecutor预先定义了一组在子类化时无法更改的命令,因为它被标记为
final
。请参见#runWorker
。
这是模板:第一个在执行前执行
,第二个任务。运行
,第三个在执行后执行
final void runWorker(Worker w) {
// ... snip
beforeExecute(wt, task);
try {
task.run();
}
...
} finally {
afterExecute(task, thrown);
}
// ... snip
}
它将实现的某些部分留给子类,beforeExecute
,afterExecute
但是是的,我知道可能会有讨论,因为在这种情况下,类只有钩子(未标记为抽象,所以允许,但不是要求)来控制子类。非常感谢您的意见:)因此,面向对象编程语言中的钩子方法似乎不能独立于模板方法而存在,是吗?当你从逻辑上考虑它时,创建一个没有最终模板方法的具有钩子的类是没有意义的,是的。谢谢:)在再次仔细阅读gof23之后,我发现其中提到了钩子操作,这是默认方法,可以重写。基于此,我同意你的回答