面向对象的洗礼:设计模式(二十三)之命令模式
命令模式解决了行为者与请求者过于紧耦合。即命令模式将一个请求指定一个响应者的模式进行了解耦化。
命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,请求排队或记录日志已经执行可撤销的操作。
命令模式的优点:第一、比较容易的设计一个队列;第二、比较容易的命令写入日志;第三、允许接收请求的一方决定是否要否决请求;第四、比较容易的实现请求的撤销和重做;第五、增加新命令不影响其他类;第六、把请求者和响应者分离。
场景:淘宝下订单,紧耦合就是点击下单按钮,请求直接发送给响应者。使用设计模式的命令模式进行解耦操作,就是点击下订单,请求发送给一个中央订单处理系统,然后由中央订单处理系统这个中间件分发给淘宝订单中心、天猫订单中心、聚划算订单中心等不同的操作,同时添加日志记录等。以PHP为代码环境来说明命令模式。
<?php class OrderCenter{ public $orderList; public function setOrder($order){ //没有库存 $isStock = true; //秒杀活动没有开始 $isActivityTime = true; if(!$isStock && !$isActivityTime){ exit('活动没开始,即将跳转回之前的页面'); }else{ $this->orderList[] = $order; } } public function cancelOrder(){ } //假定是一个队列服务 public function queue(){ foreach($this->orderList as $key=>$order){ echo '订单处理成功<br>'; $order->setOrder(); unset($this->orderList[$key]); } } } class Order{ public function buyClothes(){ echo '购买衣服成功<br>'; } public function buyShoes(){ echo '购买鞋子成功<br>'; } } abstract class Command{ public $request; public function __constrcut($requestObj){ $this->request = $requestObj; } public function setOrder(){} } class TaoBao extends Command{ public function __construct($requestObj){ parent::__constrcut($requestObj); } public function setOrder(){ echo '淘宝订单:<br>'; $this->request->buyClothes(); $this->request->buyShoes(); } } class Tmall extends Command{ public function __construct($requestObj){ parent::__constrcut($requestObj); } public function setOrder(){ echo '天猫订单:<br>'; $this->request->buyClothes(); $this->request->buyShoes(); } } //客户端/接口 $orderObj = new Order(); $taobaoObj = new TaoBao($orderObj); $tmallObj = new Tmall($orderObj); $orderCenterObj = new OrderCenter(); $orderCenterObj->setOrder($taobaoObj); $orderCenterObj->setOrder($tmallObj); $orderCenterObj->queue();