面向对象的洗礼:设计模式(二十三)之命令模式
命令模式解决了行为者与请求者过于紧耦合。即设计模式之命令模式将一个请求指定一个响应者的模式进行了解耦化。命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,请求排队或记录日志已经执行可撤销的操作。
命令模式解决了行为者与请求者过于紧耦合。即命令模式将一个请求指定一个响应者的模式进行了解耦化。
命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,请求排队或记录日志已经执行可撤销的操作。
命令模式的优点:第一、比较容易的设计一个队列;第二、比较容易的命令写入日志;第三、允许接收请求的一方决定是否要否决请求;第四、比较容易的实现请求的撤销和重做;第五、增加新命令不影响其他类;第六、把请求者和响应者分离。
场景:淘宝下订单,紧耦合就是点击下单按钮,请求直接发送给响应者。使用设计模式的命令模式进行解耦操作,就是点击下订单,请求发送给一个中央订单处理系统,然后由中央订单处理系统这个中间件分发给淘宝订单中心、天猫订单中心、聚划算订单中心等不同的操作,同时添加日志记录等。以PHP为代码环境来说明命令模式。
[code]
<?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();
[/code]
点击:2425
点赞:11
点踩:10