一、什么是模板方法模式
模板方法模式(Template Method Pattern)是一种行为型设计模式,它在父类中定义一个算法的框架,允许子类在不改变算法结构的情况下重写算法的某些特定步骤。这种模式非常适合于那些存在共同行为的类,但具体实现需要根据不同情况定制的场景。
二、模板方法模式的角色
-
抽象类(Abstract Class):
- 定义模板方法和钩子方法。模板方法是一个定义算法骨架的方法,它调用一系列钩子方法来完成具体的操作。
- 模板方法可以是具体方法,也可以是抽象方法,取决于算法框架是否允许子类改变执行顺序。
-
具体类(Concrete Class):
- 实现抽象类中定义的钩子方法,填充算法的特定步骤。
- 具体类可以完全实现钩子方法,也可以再次声明为抽象类,让更具体的子类去实现。
-
钩子方法(Hook Method):
- 抽象类中定义的可以被子类重写的方法,用于在模板方法中定义算法的特定步骤。
- 钩子方法可以是抽象的,也可以提供默认实现。
-
模板方法(Template Method):
- 抽象类中的一个具体方法,定义了算法的骨架,按顺序调用一系列钩子方法。
- 模板方法可以调用其他模板方法,形成一个模板方法的继承体系。
三、模板方法模式的典型应用场景
-
代码复用: 当希望复用某个算法或操作的不同部分时,模板方法模式可以将通用的部分封装在父类中,而将变化的部分留给子类实现。
-
依赖倒置: 当高层模块不应该依赖于低层模块,两者都应该依赖于抽象时,模板方法模式可以在抽象层定义算法框架,具体的实现依赖于子类的具体实现。
四、模板方法模式在ThreadPoolExecutor中的应用
ThreadPoolExecutor
是 Java 并发包中的一个类,它使用模板方法模式来定义线程池的任务执行流程。以下是它如何应用模板方法模式的详细解释:
-
模板方法:
execute(Runnable command)
:这是Executor
接口中的一个方法,ThreadPoolExecutor
实现了这个方法。它是一个模板方法,定义了任务执行的框架。这个方法负责将任务提交给线程池执行,包括任务队列的添加、线程的创建和启动等。
-
钩子方法:
beforeExecute(Thread t, Runnable r)
:在线程执行任务之前调用,可以被子类重写来执行一些准备工作,如资源初始化。afterExecute(Runnable r, Throwable t)
:在线程执行任务之后调用,可以被子类重用来执行一些清理工作,如资源释放。terminated()
:在所有任务执行完毕后调用,可以被子类重用来执行线程池关闭后的清理工作。
-
保护方法:
addWorker(Runnable firstTask, boolean core)
:尝试添加一个新的 worker 线程到线程池,可以是核心线程或非核心线程。runWorker(Worker w)
:执行 worker 线程的任务。
-
拒绝策略:
reject(Runnable r)
:定义了当任务不能被执行时的拒绝策略,如抛出异常或运行任务。
ThreadPoolExecutor
的模板方法模式使用示例:
public class ThreadPoolExecutor extends AbstractExecutorService {
// 模板方法
public void execute(Runnable command) {
if (!addWorker(command, false)) {
reject(command);
}
}
// 钩子方法
protected void beforeExecute(Thread t, Runnable r) {
// 可以被子类重写
}
protected void afterExecute(Runnable r, Throwable t) {
// 可以被子类重写
}
protected void terminated() {
// 可以被子类重写
}
protected void reject(Runnable r) {
// 默认的拒绝策略,可以被子类重写
throw new RejectedExecutionException();
}
// ... 其他方法 ...
}
在 ThreadPoolExecutor
中,execute
方法是模板方法,它定义了任务执行的框架,并调用了 addWorker
和 reject
方法。beforeExecute
、afterExecute
和 terminated
是钩子方法,它们可以被子类重写来添加特定的逻辑。通过这种方式,ThreadPoolExecutor
允许子类在不改变任务执行基本流程的情况下,插入特定的行为。这种设计使得线程池的行为可以灵活地被定制,同时保持了核心执行逻辑的一致性。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 【设计模式系列】模板方法模式
发表评论 取消回复