Java中的命令模式——Thread,ThreadPoolExecutor和Runnable

1. 命令模式是什么:

定义理解:命令模式最大的特性就在于将请求封装成抽象,也就是“命令”,并可以提供命令队列(可选的),支持排队、撤销等功能。

分类:行为型设计模式;

优点
(1)将请求抽象,可以动态的扩展请求的类型;
(2) 将调用代码和接收执行的代码分离开来,用“命令”这个第三方进行解耦
(3)可以方便对对命令进行管理:提供队列,日志,撤销,重做等等额外的功能;

缺点
将命令抽象出来可能会导致需要过多的具体命令实现;

对比
与策略模式:从形式上看,有些命令模式的实现方式,比如Thread和runnable好像和策略模式的形式更为接近,但Thread和Runnable是命令模式的实现原因在于“Invoker”调用者。Thread是一个调用者,它提供了start,join,interrupt等等方法让我们来控制“命令”也就是Runnable的执行。而Receiver则是让程序员可以自由与Runnale组合的抽象。
策略模式并没有Invoker,它仅仅是向Context对象传递一个策略实现;

下图展示了一个基本的命令模式包括的内容:

2. Java中命令模式的应用:

我觉得与一些我们常用的具体的工具结合起来对理解命令模式是一种更好的方式:下面列举几个Java核心类中命令模式的应用:

线程池和Runnable:

前面说了Thread和Runnable,不过我觉得用ThreadPoolExecutor能更深入的说明命令模式的强大之处。
PS
ThreadPoolExecutor是Java中线程池的实现类,Executors工具类中有多个它的工厂方法(newFixedThreadPool等),本身池的思想是享元模式的应用,这里实际上JDK通过ThreadPoolExecutor使得客户端代码和Thread解耦,我们不需要再直接控制Thread的了(ThreadPoolExecutor可以通过设置ThreadFactory定制Thread)。不过这不是本文的主题,在此不对它深入说明。

下图包含了5个类或接口:
ThreadPoolExecutor:调用者,它持有了一个命令队列,客户端代码可以向它提交要执行的任务(命令);
BlockingQueue:任务阻塞队列,它实际上就是模式中的“命令队列”;
Runnable:任务抽象,也就是“命令”;
ConcreteRunnable:具体的任务类,它持有一个Receiver;
Receiver:被调用者,也就是具体做事情的人,不过在具体的应用时,常常会将Runnable实现类直接实现具体的逻辑和这个角色有重合,不过设计模式重点在于结合场景并不是教条,不用纠结于此。




基于这样的设计,我们在使用时只要实现需要的Runnable,再通过ThreadPoolExecutor的实例方法execute,submit,shutdown,shutdownNow,remove等方法来控制命令队列的执行,此外还可以通过isShutdown,isTerminated等方法查看状态。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值