欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁(yè) > 知識(shí)庫(kù) > PHP設(shè)計(jì)模式之命令模式示例詳解

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

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

前言

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

Gof類圖及解釋

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

GoF類圖

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

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

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

首先我們定義一個(gè)命令的接收者,或者說是命令的請(qǐng)求者更恰當(dāng)。類圖中的英文定義這個(gè)單詞是“祈求者”。也就是由它來發(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();
 }
}

接下來是命令,也就是我們的“菜單”。這個(gè)命令的作用是為了定義真正的執(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);

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

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

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

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

完整代碼: 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');

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

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

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

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

我們的手機(jī)工廠和餐廳其實(shí)并沒有什么兩樣,當(dāng)我們需要代工廠來制作手機(jī)時(shí),也是先下訂單,這個(gè)訂單就可以看做是命令。在這個(gè)訂單中,我們會(huì)規(guī)定好需要用到的配件,什么型號(hào)的CPU,什么型號(hào)的內(nèi)存,預(yù)裝什么系統(tǒng)之類的。然后代工廠的工人們就會(huì)根據(jù)這個(gè)訂單來進(jìn)行生產(chǎn)。在這個(gè)過程中,我不用關(guān)心是某一個(gè)工人還是一群工人來執(zhí)行這個(gè)訂單,我只需要將這個(gè)訂單交給和我們對(duì)接的人就可以了,然后只管等著手機(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)除了工廠模式外,命令模式貌似也是一種不錯(cuò)的實(shí)現(xiàn)方式哦。在這里,我們依然是使用那幾個(gè)短信和推送的接口,話不多說,我們用命令模式再來實(shí)現(xiàn)一個(gè)吧。當(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('這次要搞個(gè)大活動(dòng),快來注冊(cè)吧!!');

說明

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

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

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP設(shè)計(jì)模式之命令模式示例詳解》,本文關(guān)鍵詞  PHP,設(shè)計(jì)模式,之,命令,模式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP設(shè)計(jì)模式之命令模式示例詳解》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于PHP設(shè)計(jì)模式之命令模式示例詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    天天影视涩香欲综合网| 欧美日韩高清丝袜| 日韩国产在线一| 国产成人一区在线| 日韩欧美视频免费观看| 欧美一卡二卡三卡| 亚洲123区在线观看| 日韩三级视频在线看| 91亚洲一线产区二线产区| 精品丰满少妇一区二区三区| 精品国产乱码久久久久久牛牛| 日本免费新一区视频| 手机在线成人av| 欧美一卡在线观看| 中文字幕一区二区三区蜜月| 国产麻豆精品在线| 国产中文字幕久久| 久久―日本道色综合久久| 久久精品国内一区二区三区| 精品人妻无码一区二区三区换脸| 欧美成人伊人久久综合网| 蜜臀久久99精品久久久画质超高清| 好吊一区二区三区视频| 日韩视频中午一区| 日本aⅴ亚洲精品中文乱码| 成人做爰69片免费| 欧美一区国产二区| 日韩高清不卡一区二区三区| 超碰97人人干| 久久精品人人做人人爽人人| 国产99精品视频| 久久久久99精品成人片试看| 亚洲激情在线激情| 亚洲图片欧美另类| 精品久久久久久综合日本欧美| 美洲天堂一区二卡三卡四卡视频| 亚洲男人在线天堂| 欧美精品一区二区久久久| 国产精品 日产精品 欧美精品| 全网免费在线播放视频入口| 亚洲乱码一区二区三区在线观看| 亚洲国产综合av| 欧美一区永久视频免费观看| 国产在线日韩欧美| 破处女黄色一级片| 亚洲一二三级电影| 国产熟妇久久777777| 亚洲国产激情av| 丰满饥渴老女人hd| 欧美日韩一级片在线观看| 日本美女视频一区二区| 色偷偷男人天堂| 一区二区三区四区高清精品免费观看 | 你懂的在线观看网站| xvideos.蜜桃一区二区| 国产成人三级在线观看| 欧美日韩中文字幕精品| 久久不见久久见免费视频7| 三级在线观看免费大全| 亚洲妇女屁股眼交7| av网站免费在线看| 国产精品国产三级国产aⅴ原创| 一个人看的视频www| 精品人在线二区三区| 成人亚洲一区二区一| 欧美日韩成人综合| 国模娜娜一区二区三区| 欧日韩精品视频| 精品无人区卡一卡二卡三乱码免费卡 | 国产偷国产偷精品高清尤物 | 亚洲一区二区四区蜜桃| 天天干天天舔天天操| 亚洲男同性视频| 亚洲精品色午夜无码专区日韩| 日韩毛片在线免费观看| 亚洲综合色一区| 亚洲黄色录像片| 国产亚洲精品熟女国产成人| 伊人婷婷欧美激情| 日韩女同一区二区三区| 亚洲成人中文在线| 成人涩涩小片视频日本| 奇米888四色在线精品| 日本道精品一区二区三区| 国内精品伊人久久久久av影院| 欧美视频日韩视频在线观看| 国产酒店精品激情| 欧美一区二区三级| 91在线视频免费观看| 久久久亚洲精华液精华液精华液| 极品白嫩的小少妇| 国产精品乱码人人做人人爱| 波多野结衣a v在线| 亚洲成年人影院| 色综合久久久久综合体桃花网| 久久99九九99精品| 91精品国产乱码久久蜜臀| 91在线看国产| 国产精品乱人伦| 欧美亚洲色综久久精品国产| 日韩电影在线观看电影| 欧美羞羞免费网站| 蜜臀久久99精品久久久久久9 | 东京热av一区| 久久色成人在线| 丰满人妻一区二区三区免费视频棣| 久久嫩草精品久久久精品一| 18深夜在线观看免费视频| 日韩欧美高清一区| 佐佐木明希电影| 中文字幕免费不卡在线| 亚洲观看黄色网| 亚洲成人av资源| 国产精品色眯眯| 久久久久久久久久久国产精品| 亚洲国产精品一区二区尤物区| 一本到高清视频免费精品| 国产黑丝在线一区二区三区| 日韩免费高清av| 日韩aaaaa| 亚洲va韩国va欧美va精品| 欧洲一区二区三区在线| jlzzjlzz亚洲女人18| 国产精品二区一区二区aⅴ污介绍| 国产日韩精品中文字无码| 久久99日本精品| 精品国产电影一区二区| 亚洲综合色一区| 精品亚洲国内自在自线福利| 精品国产一区二区在线观看| 插吧插吧综合网| 奇米影视一区二区三区| 日韩欧美中文字幕公布| 男生裸体视频网站| 另类调教123区| 精品国产一区二区三区不卡| 性高潮久久久久久久| 国产主播一区二区三区| 国产欧美综合色| 中文字幕乱码av| 成人一道本在线| 一区二区在线观看免费视频播放| 欧洲精品中文字幕| 最新国产精品自拍| 婷婷久久综合九色综合绿巨人| 欧美一级理论片| 欧美 日韩 国产 成人 在线观看| 国产一区二区0| 国产精品久久久久久久久快鸭 | 国产精品久线在线观看| 欧美视频www| 91视频你懂的| 亚洲小说欧美激情另类| 日韩精品一区二区在线观看| 国产毛片欧美毛片久久久| 亚洲老司机在线| 欧美日韩一区二区三区四区五区| 男人网站在线观看| 久久精品国产99国产精品| 国产视频一区在线播放| 国产这里有精品| 无码人妻丰满熟妇啪啪网站| 老司机午夜精品| 欧美性感一区二区三区| 黄免费在线观看| 在线看黄色的网站| 香蕉视频污视频| 国产一区二区三区黄视频 | 国产综合色精品一区二区三区| 日本一区二区三区高清不卡| 欧美午夜一区二区三区免费大片| 成人精品一二三区| 在线观看91精品国产入口| jlzzjlzz亚洲日本少妇| 天天av天天翘天天综合网| 久久久综合九色合综国产精品| 久久久精品视频免费观看| 中国特级黄色大片| 国内精品免费**视频| 亚洲天堂精品在线观看| 91精品国产91久久久久久一区二区| 黄色一级片一级片| 精品国产aⅴ一区二区三区东京热| 青娱乐精品视频| 国产精品久久777777| 91精品视频网| 熟女少妇a性色生活片毛片| 最新国产精品自拍| 国产高清成人在线| 亚洲成人自拍一区| 亚洲国产成人私人影院tom| 欧美人xxxx| 欧美风情第一页| 国产十八熟妇av成人一区| 国产精品99久久不卡二区| 亚洲高清免费视频| 国产欧美日韩不卡| 欧美一区二区三区精品| 永久看片925tv| 在线小视频你懂的|