LaneBlog

蝼蚁虽小,也有梦想

PHP Socket服务 | PHP微信开发框架 | 开源博客

面向对象的洗礼:设计模式(二十三)之命令模式

Clicks: 2064 Date: 2014-04-28 14:46:30 Power By 李轩Lane

    命令模式解决了行为者与请求者过于紧耦合。即命令模式将一个请求指定一个响应者的模式进行了解耦化。
    命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,请求排队或记录日志已经执行可撤销的操作。
    命令模式的优点:第一、比较容易的设计一个队列;第二、比较容易的命令写入日志;第三、允许接收请求的一方决定是否要否决请求;第四、比较容易的实现请求的撤销和重做;第五、增加新命令不影响其他类;第六、把请求者和响应者分离。
    场景:淘宝下订单,紧耦合就是点击下单按钮,请求直接发送给响应者。使用设计模式的命令模式进行解耦操作,就是点击下订单,请求发送给一个中央订单处理系统,然后由中央订单处理系统这个中间件分发给淘宝订单中心、天猫订单中心、聚划算订单中心等不同的操作,同时添加日志记录等。以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();
Add Comment
©2014 www.lanecn.com , All rights reserved. Power By Li Xuan.  京ICP备14005030号