校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > PHP設(shè)計模式之命令模式示例詳解

PHP設(shè)計模式之命令模式示例詳解

熱門標(biāo)簽:gps 地圖標(biāo)注軟件 400電話鄭州申請 黔江400電話如何辦理 ai電話機(jī)器人加盟代理 中原區(qū)電話機(jī)器人價格 招標(biāo)自動語音外呼系統(tǒng) OMG地圖標(biāo)注app 地圖標(biāo)注視頻廣告入駐 電銷機(jī)器人便宜的有嗎

前言

命令模式,也稱為動作或者事務(wù)模式,很多教材會用飯館來舉例。作為顧客的我們是命令的下達(dá)者,服務(wù)員是這個命令的接收者,菜單是這個實(shí)際的命令,而廚師是這個命令的執(zhí)行者。那么,這個模式解決了什么呢?當(dāng)你要修改菜單的時候,只需要和服務(wù)員說就好了,她會轉(zhuǎn)達(dá)給廚師,也就是說,我們實(shí)現(xiàn)了顧客和廚師的解耦。也就是調(diào)用者與實(shí)現(xiàn)者的解耦。當(dāng)然,很多設(shè)計模式可以做到這一點(diǎn),但是命令模式能夠做到的是讓一個命令接收者實(shí)現(xiàn)多個命令(服務(wù)員下單、拿酒水、上菜),或者把一條命令轉(zhuǎn)達(dá)給多個實(shí)現(xiàn)者(熱菜廚師、涼菜廚師、主食師傅)。這才是命令模式真正發(fā)揮的地方!!

Gof類圖及解釋

GoF定義:將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進(jìn)行參數(shù)化;對請求排隊(duì)或記錄請求日志,以及支持可撤消的操作

GoF類圖

代碼實(shí)現(xiàn)

class Invoker
{
 public $command;
 
 public function __construct($command)
 {
  $this->command = $command;
 }

 public function exec()
 {
  $this->command->execute();
 }
}

首先我們定義一個命令的接收者,或者說是命令的請求者更恰當(dāng)。類圖中的英文定義這個單詞是“祈求者”。也就是由它來發(fā)起和操作命令。

abstract class Command
{
 protected $receiver;

 public function __construct(Receiver $receiver)
 {
  $this->receiver = $receiver;
 }

 abstract public function execute();
}

class ConcreteCommand extends Command
{
 public function execute()
 {
  $this->receiver->action();
 }
}

接下來是命令,也就是我們的“菜單”。這個命令的作用是為了定義真正的執(zhí)行者是誰。

class Receiver
{
 public $name;

 public function __construct($name)
 {
  $this->name = $name;
 }

 public function action()
 {
  echo $this->name . '命令執(zhí)行了!', PHP_EOL;
 }
}

接管者,也就是執(zhí)行者,真正去執(zhí)行命令的人。

// 準(zhǔn)備執(zhí)行者
$receiverA = new Receiver('A');

// 準(zhǔn)備命令
$command = new ConcreteCommand($receiverA);

// 請求者
$invoker = new Invoker($command);
$invoker->exec();

客戶端的調(diào)用,我們要聯(lián)系好執(zhí)行者也就是挑有好廚子的飯館(Receiver),然后準(zhǔn)備好命令也就是菜單(Command),最后交給服務(wù)員(Invoker)。

其實(shí)這個飯店的例子已經(jīng)非常清晰了,對于命令模式真是完美的解析

那說好的可以下多份訂單或者給多個廚師呢?別急,下面的代碼幫助我們解決這個問題

完整代碼: https://github.com/zhangyue0503/designpatterns-php/blob/master/09.command/source/command.php

?php

class Invoker
{
 private $command = [];

 public function setCommand(Command $command)
 {
  $this->command[] = $command;
 }

 public function exec()
 {
  if(count($this->command) > 0){
   foreach ($this->command as $command) {
    $command->execute();
   }
  }
 }

 public function undo()
 {
  if(count($this->command) > 0){
   foreach ($this->command as $command) {
    $command->undo();
   }
  }
 }
}

abstract class Command
{
 protected $receiver;
 protected $state;
 protected $name;

 public function __construct(Receiver $receiver, $name)
 {
  $this->receiver = $receiver;
  $this->name = $name;
 }

 abstract public function execute();
}

class ConcreteCommand extends Command
{
 public function execute()
 {
  if (!$this->state || $this->state == 2) {
   $this->receiver->action();
   $this->state = 1;
  } else {
   echo $this->name . '命令正在執(zhí)行,無法再次執(zhí)行了!', PHP_EOL;
  }

 }
 
 public function undo()
 {
  if ($this->state == 1) {
   $this->receiver->undo();
   $this->state = 2;
  } else {
   echo $this->name . '命令未執(zhí)行,無法撤銷了!', PHP_EOL;
  }
 }
}

class Receiver
{
 public $name;
 public function __construct($name)
 {
  $this->name = $name;
 }
 public function action()
 {
  echo $this->name . '命令執(zhí)行了!', PHP_EOL;
 }
 public function undo()
 {
  echo $this->name . '命令撤銷了!', PHP_EOL;
 }
}

// 準(zhǔn)備執(zhí)行者
$receiverA = new Receiver('A');
$receiverB = new Receiver('B');
$receiverC = new Receiver('C');

// 準(zhǔn)備命令
$commandOne = new ConcreteCommand($receiverA, 'A');
$commandTwo = new ConcreteCommand($receiverA, 'B');
$commandThree = new ConcreteCommand($receiverA, 'C');

// 請求者
$invoker = new Invoker();
$invoker->setCommand($commandOne);
$invoker->setCommand($commandTwo);
$invoker->setCommand($commandThree);
$invoker->exec();
$invoker->undo();

// 新加一個單獨(dú)的執(zhí)行者,只執(zhí)行一個命令
$invokerA = new Invoker();
$invokerA->setCommand($commandOne);
$invokerA->exec();

// 命令A(yù)已經(jīng)執(zhí)行了,再次執(zhí)行全部的命令執(zhí)行者,A命令的state判斷無法生效
$invoker->exec();

  • 這一次我們一次性解決了多個訂單、多位廚師的問題,并且還順便解決了如果下錯命令了,進(jìn)行撤銷的問題
  • 可以看出來,命令模式將調(diào)用操作的對象與知道如何實(shí)現(xiàn)該操作的對象實(shí)現(xiàn)了解耦
  • 這種多命令多執(zhí)行者的實(shí)現(xiàn),有點(diǎn)像 組合模式 的實(shí)現(xiàn)
  • 在這種情況下,增加新的命令,即不會影響執(zhí)行者,也不會影響客戶。當(dāng)有新的客戶需要新的命令時,只需要增加命令和請求者即可。即使有修改的需求,也只是修改請求者。
  • Laravel框架的事件調(diào)度機(jī)制中,除了觀察者模式外,也很明顯的能看出命令模式的影子

我們的手機(jī)工廠和餐廳其實(shí)并沒有什么兩樣,當(dāng)我們需要代工廠來制作手機(jī)時,也是先下訂單,這個訂單就可以看做是命令。在這個訂單中,我們會規(guī)定好需要用到的配件,什么型號的CPU,什么型號的內(nèi)存,預(yù)裝什么系統(tǒng)之類的。然后代工廠的工人們就會根據(jù)這個訂單來進(jìn)行生產(chǎn)。在這個過程中,我不用關(guān)心是某一個工人還是一群工人來執(zhí)行這個訂單,我只需要將這個訂單交給和我們對接的人就可以了,然后只管等著手機(jī)生產(chǎn)出來進(jìn)行驗(yàn)收咯!!

完整代碼: https://github.com/zhangyue0503/designpatterns-php/blob/master/09.command/source/command-up.php

實(shí)例

短信功能又回來了,我們發(fā)現(xiàn)除了工廠模式外,命令模式貌似也是一種不錯的實(shí)現(xiàn)方式哦。在這里,我們依然是使用那幾個短信和推送的接口,話不多說,我們用命令模式再來實(shí)現(xiàn)一個吧。當(dāng)然,有興趣的朋友可以接著實(shí)現(xiàn)我們的短信撤回功能哈,想想上面的命令取消是怎么實(shí)現(xiàn)的。

短信發(fā)送類圖

完整源碼: https://github.com/zhangyue0503/designpatterns-php/blob/master/09.command/source/command-message.php

?php

class SendMsg
{
 private $command = [];

 public function setCommand(Command $command)
 {
  $this->command[] = $command;
 }
 
 public function send($msg)
 {
  foreach ($this->command as $command) {
   $command->execute($msg);
  }
 }
}

abstract class Command
{
 protected $receiver = [];

 public function setReceiver($receiver)
 {
  $this->receiver[] = $receiver;
 }

 abstract public function execute($msg);
}

class SendAliYun extends Command
{
 public function execute($msg)
 {
  foreach ($this->receiver as $receiver) {
   $receiver->action($msg);
  }
 }
}

class SendJiGuang extends Command
{
 public function execute($msg)
 {
  foreach ($this->receiver as $receiver) {
   $receiver->action($msg);
  }
 }
}

class SendAliYunMsg
{
 public function action($msg)
 {
  echo '【阿X云短信】發(fā)送:' . $msg, PHP_EOL;
 }
}

class SendAliYunPush
{
 public function action($msg)
 {
  echo '【阿X云推送】發(fā)送:' . $msg, PHP_EOL;
 }
}

class SendJiGuangMsg
{
 public function action($msg)
 {
  echo '【極X短信】發(fā)送:' . $msg, PHP_EOL;
 }
}

class SendJiGuangPush
{
 public function action($msg)
 {
  echo '【極X推送】發(fā)送:' . $msg, PHP_EOL;
 }
}

$aliMsg = new SendAliYunMsg();
$aliPush = new SendAliYunPush();
$jgMsg = new SendJiGuangMsg();
$jgPush = new SendJiGuangPush();

$sendAliYun = new SendAliYun();
$sendAliYun->setReceiver($aliMsg);
$sendAliYun->setReceiver($aliPush);

$sendJiGuang = new SendJiGuang();
$sendAliYun->setReceiver($jgMsg);
$sendAliYun->setReceiver($jgPush);

$sendMsg = new SendMsg();
$sendMsg->setCommand($sendAliYun);
$sendMsg->setCommand($sendJiGuang);

$sendMsg->send('這次要搞個大活動,快來注冊吧!!');

說明

  • 在這個例子中,依然是多命令多執(zhí)行者的模式
  • 可以將這個例子與抽象工廠進(jìn)行對比,同樣的功能使用不同的設(shè)計模式來實(shí)現(xiàn),但是要注意的是,抽象工廠更多的是為了生產(chǎn)對象返回對象,而命令模式則是一種行為的選擇
  • 我們可以看出命令模式非常適合形成命令隊(duì)列,多命令讓命令可以一條一條執(zhí)行下去
  • 它允許接收的一方?jīng)Q定是否要否決請求,Receiver做為實(shí)現(xiàn)者擁有更多的話語權(quán)

到此這篇關(guān)于PHP設(shè)計模式之命令模式的文章就介紹到這了,更多相關(guān)PHP設(shè)計模式之命令模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • PHP設(shè)計模式(觀察者模式)
  • 淺談PHP設(shè)計模式之門面模式Facade
  • 淺談PHP設(shè)計模式之對象池模式Pool
  • 詳解PHP設(shè)計模式之依賴注入模式
  • PHP設(shè)計模式之迭代器模式的使用
  • 詳解PHP八大設(shè)計模式
  • PHP設(shè)計模式之原型模式示例詳解
  • PHP八大設(shè)計模式案例詳解

標(biāo)簽:池州 那曲 日照 哈密 阿里 北京 孝感 濟(jì)源

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP設(shè)計模式之命令模式示例詳解》,本文關(guān)鍵詞  PHP,設(shè)計模式,之,命令,模式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP設(shè)計模式之命令模式示例詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于PHP設(shè)計模式之命令模式示例詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    色婷婷综合久久久久中文| 成人av影院在线| 亚洲一二三四在线| 欧美国产精品久久| 日韩欧美一级二级| 欧美精品三级在线观看| 国产99久久久国产精品| 美女视频黄 久久| 亚洲一区影音先锋| 亚洲色图都市小说| 精品少妇一区二区三区在线播放 | 日韩国产精品久久| 亚洲日穴在线视频| 中文字幕av一区二区三区| 久久女同互慰一区二区三区| 欧美日韩三级一区二区| 91久久精品日日躁夜夜躁欧美| 国产一区二区三区日韩| 精品一区二区三区蜜桃| 男女性色大片免费观看一区二区 | 国产成人在线视频网站| 久久国产尿小便嘘嘘尿| 九色综合国产一区二区三区| 一区二区三区精品| 日韩电影在线观看一区| 国产尤物一区二区| 国产69精品久久99不卡| 92国产精品观看| 欧美日韩一区不卡| 日韩欧美色综合| 欧美激情综合网| 亚洲国产一区二区三区青草影视| 亚洲国产精品嫩草影院| 久久国产精品露脸对白| 国产精品正在播放| 欧美在线不卡一区| 日韩欧美www| 一区精品在线播放| 精品一区二区三区免费| 亚洲在线观看免费| 亚洲乱码精品一二三四区日韩在线| 亚洲人成精品久久久久| 蜜桃精品视频在线| 午夜精品免费在线观看| 亚洲成人av中文| 国产美女娇喘av呻吟久久| 一本大道久久精品懂色aⅴ| 欧美久久久久中文字幕| 久久久久久黄色| 日韩精品亚洲一区二区三区免费| 国产一区二区三区在线观看免费视频 | 91精品蜜臀在线一区尤物| 久久青草欧美一区二区三区| 亚洲一区在线观看网站| 国产成人精品亚洲午夜麻豆| 精品视频一区三区九区| 精品国产乱码久久久久久图片 | 国产喷白浆一区二区三区| 免费av成人在线| 91在线视频网址| 久久久精品影视| 久久精品国产在热久久| 欧美视频三区在线播放| 亚洲精品成人天堂一二三| 不卡的av在线| 国产精品久久久久久久裸模| 国内精品免费**视频| 欧美大尺度电影在线| 日韩成人av影视| 日韩欧美亚洲国产另类 | 亚洲超丰满肉感bbw| 91福利资源站| 视频一区二区国产| 69精品人人人人| 精品一区二区三区欧美| 久久综合狠狠综合| 成人亚洲一区二区一| 欧美激情一区二区三区四区| 成人av免费在线播放| 亚洲视频网在线直播| 欧美午夜精品理论片a级按摩| 亚洲男人天堂av| 色综合久久99| 国产精品天干天干在观线 | 美女脱光内衣内裤视频久久网站 | 国产 日韩 欧美大片| 亚洲人精品一区| 日韩美女主播在线视频一区二区三区 | 国产午夜亚洲精品不卡| 97久久人人超碰| 日韩在线一区二区三区| 国产精品污网站| 制服丝袜日韩国产| av爱爱亚洲一区| 日韩二区在线观看| 亚洲视频免费观看| 欧美成人a在线| 色94色欧美sute亚洲线路一久| 日韩一区精品视频| 亚洲素人一区二区| 久久综合久久久久88| 欧美日韩精品综合在线| 国产不卡视频一区| 美女一区二区视频| 亚洲精品高清在线观看| 国产人成一区二区三区影院| 这里只有精品电影| 91麻豆免费看| 成人av资源站| 成人动漫精品一区二区| 久久99国产精品久久99| 日韩激情中文字幕| 天天爽夜夜爽夜夜爽精品视频| 亚洲男人的天堂网| 亚洲国产毛片aaaaa无费看| 国产日韩欧美a| 国产色综合久久| 久久久久久久久99精品| 欧美videossexotv100| 欧美高清一级片在线| 欧美体内she精高潮| 一本久久a久久免费精品不卡| 福利电影一区二区| zzijzzij亚洲日本少妇熟睡| 成人动漫在线一区| av资源网一区| 91国偷自产一区二区三区观看| 色欧美88888久久久久久影院| 成人黄色一级视频| 色成年激情久久综合| 欧美日韩第一区日日骚| 7777精品伊人久久久大香线蕉超级流畅 | 亚洲一区二区美女| 人禽交欧美网站| 国产高清无密码一区二区三区| 国产成人av资源| 99国产精品99久久久久久| 色婷婷久久久综合中文字幕 | 国产日韩欧美亚洲| 亚洲人妖av一区二区| 亚洲v中文字幕| 国产原创一区二区三区| 99国产精品久久久久久久久久 | 日日夜夜免费精品| 国产成人夜色高潮福利影视| 国产精品一区免费视频| 免费在线看成人av| 菠萝蜜视频在线观看一区| 成人h动漫精品一区二区| 精品一区二区在线视频| 99综合影院在线| 日韩一级免费观看| 日韩欧美电影一二三| 91亚洲大成网污www| 日本二三区不卡| 国产亚洲一区二区三区四区| 亚洲欧美国产毛片在线| 精品亚洲aⅴ乱码一区二区三区| 久久综合九色综合欧美98| 不卡的av电影| 精品一区中文字幕| 亚洲影视在线观看| 国产午夜精品久久| 欧美一区二区三区喷汁尤物| 精品一区二区国语对白| 日韩欧美国产一区在线观看| 国产精品成人在线观看| 一区二区三区日韩在线观看| 一区二区久久久久久| 精品一区二区影视| 精品视频一区三区九区| 亚洲女子a中天字幕| 九九国产精品视频| 69堂国产成人免费视频| 中文字幕精品一区| 国产午夜精品理论片a级大结局| 亚洲综合久久久久| 成人黄色软件下载| 欧美一级一级性生活免费录像| 亚洲黄色av一区| 91毛片在线观看| 亚洲成人动漫精品| 欧美视频三区在线播放| 最新国产成人在线观看| 91视频在线看| 国产精品国产三级国产普通话蜜臀| 国产精品一二三区在线| 亚洲精品一卡二卡| 一本到三区不卡视频| 亚洲高清免费视频| 久久免费电影网| 不卡的av电影| 亚洲免费观看在线观看| 欧美日韩电影在线播放| 久久精品国产亚洲a| 1区2区3区欧美| 精品久久久久久久久久久院品网| 国产乱码精品一区二区三区五月婷| 久久精品一区蜜桃臀影院| 欧美怡红院视频|