公号:码农充电站pro
主页:https://codeshellme.github.iohtml
本篇来介绍命令模式(Command Design Pattern),它将“请求”封装成对象,从而将“请求”的建立者与“请求”的执行者解耦。java
相信你们都在网上买过东西,咱们以淘宝为例来介绍命令模式。git
咱们假设这样一个简单的场景:github
在这个过程当中,淘宝网并不关心每家商店的具体状况,它只知道每家商店都能完成它所派发的订单。算法
那么,咱们怎样为这个场景建模呢?shell
从上面购物流程中,咱们能看出来,链接顾客,淘宝网与商店的中间桥梁是订单:架构
首先,咱们须要定义一个 Order
接口:测试
interface Order { void execute(); }
Order
接口中只有一个 execute
方法,须要派生类来实现。this
而后定义一个华为商店:线程
abstract class Shops { protected String shopName; protected abstract String sell(); } class HuaWeiShop extends Shops { public HuaWeiShop() { this.shopName = "HUAWEI"; } public String sell() { return "HuaWei Phone"; } }
上面代码中,Shops
是一个抽象类,表示商店,商店能够销售商品。HuaWeiShop
类继承了 Shops
接口,实现了 sell
方法。
而后定义一个 GoodsOrder
类,它继承了 Order
接口,并实现了 execute
方法:
class GoodsOrder implements Order { private Shops shop; public GoodsOrder(Shops shop) { this.shop = shop; } public void execute() { String goods = shop.sell(); System.out.println(goods); } }
而后定义 Client
类,用于生成订单:
class Client { public Order createOrder() { Shops phone = new HuaWeiShop(); Order phoneOrder = new GoodsOrder(phone); return phoneOrder; } }
下面定义淘宝网,它能够接收订单和处理订单:
class Taobao { private Order order; public void receiveOrder(Order order) { this.order = order; } // 处理订单 public void handleOrder() { order.execute(); } }
最后来测试代码:
Client c = new Client(); Order order = c.createOrder(); // 顾客生成订单 Taobao t = new Taobao(); t.receiveOrder(order); // 淘宝接收订单 t.handleOrder(); // 淘宝处理订单
输出以下:
HuaWei Phone
输出表示顾客成功买到了手机。
咱们画出上面代码的类图,以下:
我将完整的命令模式代码放在了这里,供你们参考。
实际上,上面代码的实现方式就是命令模式。
命令模式将请求(命令)封装为一个对象,这样能够将不一样请求注入到其余对象,而且可以支持请求(命令)的排队执行、记录日志、撤销等功能。
命令模式中包含如下几个组件(并把组件类比到上面的购物场景中):
命令模式的类图以下(与上面购物代码的类图一致):
上图的 Command 接口中有一个 undo
方法,它是 execute
方法的反操做,用于实现撤销功能。
命令模式经过将请求封装成对象,将请求的建立者,请求的调用者和请求的执行者,这三者之间完全解耦:
请求服务是一种由客户端发出请求,而后由服务端去处理的一种程序架构,不一样的客户端之间互不干扰。
咱们上面模拟的购物程序能够说使用的就是这种架构,以下:
好比 Redis Server 处理 Client 命令的方式使用的就是这种架构。
请求被封装成对象后,可将其放在请求队列中,而后由工做线程将其取出,再执行。
这种架构也至关于一个生产者-消费者架构。
请求被封装成对象后,也能够将其记录在日志中。若是服务意外崩溃,服务重启后就可使用请求日志,将服务恢复到崩溃以前的状态。
好比 Redis 的 AOF 持久化使用的就是这种方式。
命令模式将请求封装成对象,有两个优势:
命令模式的这些优势,使得咱们能够实现请求的排队执行、记录日志等功能。
(本节完。)
推荐阅读:
欢迎关注做者公众号,获取更多技术干货。