成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

PHP設計模式之命令模式示例詳解

瀏覽:120日期:2022-09-08 13:37:31
前言

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

Gof類圖及解釋

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

GoF類圖

PHP設計模式之命令模式示例詳解

代碼實現

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

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

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(); }}

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

class Receiver{ public $name; public function __construct($name) { $this->name = $name; } public function action() { echo $this->name . ’命令執行了!’, PHP_EOL; }}

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

// 準備執行者$receiverA = new Receiver(’A’);// 準備命令$command = new ConcreteCommand($receiverA);// 請求者$invoker = new Invoker($command);$invoker->exec();

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

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

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

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

<?phpclass 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 . ’命令正在執行,無法再次執行了!’, PHP_EOL; } } public function undo() { if ($this->state == 1) { $this->receiver->undo(); $this->state = 2; } else { echo $this->name . ’命令未執行,無法撤銷了!’, PHP_EOL; } }}class Receiver{ public $name; public function __construct($name) { $this->name = $name; } public function action() { echo $this->name . ’命令執行了!’, PHP_EOL; } public function undo() { echo $this->name . ’命令撤銷了!’, PHP_EOL; }}// 準備執行者$receiverA = new Receiver(’A’);$receiverB = new Receiver(’B’);$receiverC = new Receiver(’C’);// 準備命令$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();// 新加一個單獨的執行者,只執行一個命令$invokerA = new Invoker();$invokerA->setCommand($commandOne);$invokerA->exec();// 命令A已經執行了,再次執行全部的命令執行者,A命令的state判斷無法生效$invoker->exec(); 這一次我們一次性解決了多個訂單、多位廚師的問題,并且還順便解決了如果下錯命令了,進行撤銷的問題 可以看出來,命令模式將調用操作的對象與知道如何實現該操作的對象實現了解耦 這種多命令多執行者的實現,有點像 組合模式 的實現 在這種情況下,增加新的命令,即不會影響執行者,也不會影響客戶。當有新的客戶需要新的命令時,只需要增加命令和請求者即可。即使有修改的需求,也只是修改請求者。 Laravel框架的事件調度機制中,除了觀察者模式外,也很明顯的能看出命令模式的影子

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

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

實例

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

短信發送類圖

PHP設計模式之命令模式示例詳解

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

<?phpclass 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云短信】發送:’ . $msg, PHP_EOL; }}class SendAliYunPush{ public function action($msg) { echo ’【阿X云推送】發送:’ . $msg, PHP_EOL; }}class SendJiGuangMsg{ public function action($msg) { echo ’【極X短信】發送:’ . $msg, PHP_EOL; }}class SendJiGuangPush{ public function action($msg) { echo ’【極X推送】發送:’ . $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(’這次要搞個大活動,快來注冊吧!!’);說明 在這個例子中,依然是多命令多執行者的模式 可以將這個例子與抽象工廠進行對比,同樣的功能使用不同的設計模式來實現,但是要注意的是,抽象工廠更多的是為了生產對象返回對象,而命令模式則是一種行為的選擇 我們可以看出命令模式非常適合形成命令隊列,多命令讓命令可以一條一條執行下去 它允許接收的一方決定是否要否決請求,Receiver做為實現者擁有更多的話語權

到此這篇關于PHP設計模式之命令模式的文章就介紹到這了,更多相關PHP設計模式之命令模式內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: PHP
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
黄色工厂这里只有精品| 久久久久久久久久码影片| 欧美国产综合| 久久久久久久久久久电影| 精品午夜久久福利影院| 国产精品一卡| 中日韩av电影| 99精品在线观看视频| 91精品中文字幕一区二区三区| 婷婷中文字幕一区三区| 亚洲二区三区四区| 日韩中文字幕区一区有砖一区 | 亚洲一区二区在线免费观看视频| 色一情一伦一子一伦一区| www.日韩精品| 图片区日韩欧美亚洲| 精品电影一区二区三区 | 日韩视频一区在线观看| 精品在线播放午夜| 色视频欧美一区二区三区| 亚洲国产精品尤物yw在线观看| 亚洲精品字幕| 亚洲女女做受ⅹxx高潮| 国产精品二区三区四区| 中文av字幕一区| 亚洲欧美一区二区三区久本道91| 波多野结衣中文字幕一区二区三区 | 亚洲视频一二区| 欧美三级第一页| 久久婷婷久久一区二区三区| 国产成人综合自拍| 久久久久久久久久电影| 成人午夜在线免费| 日韩视频在线观看一区二区| 国产成人福利片| 91精品国产高清一区二区三区蜜臀 | 紧缚奴在线一区二区三区| 西西人体一区二区| 日韩久久一区二区| 亚洲网站啪啪| 欧美大片日本大片免费观看| 精品一区二区三区在线观看| 91福利精品第一导航| 亚洲在线观看免费| 亚洲精品韩国| 欧美电影免费观看完整版| 国产一区三区三区| 欧美女孩性生活视频| 另类小说色综合网站| 色婷婷av一区二区三区之一色屋| 亚洲一区二区三区四区在线| 日韩午夜视频在线观看| 亚洲免费资源在线播放| 欧美精选一区| 久久亚洲精品国产精品紫薇| 成人黄色在线看| 日韩精品中文字幕一区| www.欧美.com| 精品捆绑美女sm三区| 成人黄色网址在线观看| 久久久久一区二区三区四区| 国产精品videosex极品| 亚洲综合免费观看高清完整版在线| 欧美三级日本三级少妇99| 久久精品盗摄| 亚洲第一网站| 136国产福利精品导航| 久久久久久久高潮| 国产精品一区二区视频| 欧美日韩福利| 91美女在线看| 国产亚洲亚洲| 日本道色综合久久| 欧美日韩一区二区三区高清| 8x8x8国产精品| 精品国产乱码久久| 国产欧美一区二区精品久导航| 亚洲欧美一区二区三区久本道91 | 亚洲一级不卡视频| 麻豆久久一区二区| 成人少妇影院yyyy| 亚洲一级二级| 欧美午夜精品免费| 久久亚洲一区二区三区四区| 亚洲欧洲成人自拍| 亚洲国产一区在线观看| 韩国成人福利片在线播放| 91麻豆国产自产在线观看| 国产日韩三区| 精品国产青草久久久久福利| 洋洋av久久久久久久一区| 韩国毛片一区二区三区| 欧美成人一品| 欧美三电影在线| 久久日一线二线三线suv| 亚洲男人的天堂网| 国产麻豆一精品一av一免费| 欧美日韩一区二区三区免费| 色偷偷成人一区二区三区91| 久久免费的精品国产v∧| 亚洲国产精品尤物yw在线观看| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲男人影院| 日韩一区二区三区四区| 亚洲乱码国产乱码精品精98午夜| 国产一区二区三区在线观看免费视频| 很黄很黄激情成人| 欧美精品日韩精品| 亚洲制服丝袜av| 99久久国产综合精品色伊| 一区二区福利| 久久天天做天天爱综合色| 亚洲成人动漫在线观看| www.欧美.com| 777午夜精品视频在线播放| 亚洲成人精品在线观看| 色综合中文综合网| 亚洲人成精品久久久久久 | 日韩欧美一区二区视频| 五月婷婷欧美视频| 激情另类综合| 久久久91精品国产一区二区精品| 日韩高清在线观看| 亚洲国产欧美不卡在线观看| 久久亚洲影视婷婷| 国产成人免费高清| 欧美日韩成人综合| 日本不卡不码高清免费观看| 亚洲网友自拍| 国产欧美一区二区三区在线看蜜臀 | 看电影不卡的网站| 国产精品久久九九| 一区二区三区免费网站| 欧美在线三级| 久久久久久久久久久久久久久99 | 在线观看日韩av电影| 26uuu亚洲综合色| 国产乱理伦片在线观看夜一区 | 奇米精品一区二区三区在线观看| 国产九九精品| 亚洲综合成人在线视频| 亚洲美女一区| 亚洲一线二线三线视频| 国产精品日韩欧美一区二区三区| 亚洲欧美日韩一区| 亚洲精品在线观看免费| 一区二区三区欧美日韩| 亚洲欧洲精品一区二区| 亚洲天堂a在线| 亚洲人成人一区二区三区| 国产精品乱人伦| 亚洲二区免费| 亚洲午夜激情av| 免费看黄裸体一级大秀欧美| 青青草伊人久久| 欧美日韩日本视频| 国产精品一区专区| 久久免费精品国产久精品久久久久| 成人综合在线视频| 精品国产乱码久久| 欧美日韩国产高清视频| 国产精品传媒在线| 精品999在线观看| 香蕉成人伊视频在线观看| 欧美性生活久久| 99国产精品99久久久久久| 《视频一区视频二区| 欧美一级网站| 国产精品一区在线观看你懂的| 2023国产一二三区日本精品2022| 欧美 日韩 国产 一区| 一区二区欧美在线观看| 欧美性做爰猛烈叫床潮| 风间由美一区二区三区在线观看 | 国产一区二区三区在线观看免费| 日韩欧美成人激情| 红桃视频国产一区| 亚洲成在线观看| 欧美男男青年gay1069videost| aaa欧美日韩| 亚洲一区二区欧美| 欧美人牲a欧美精品| 午夜精品国产| 日韩vs国产vs欧美| 26uuu欧美| 美脚丝袜一区二区三区在线观看 | 91国产视频在线观看| 91网站视频在线观看| 亚洲日本在线天堂| 色94色欧美sute亚洲13| 成人精品视频网站| 偷窥国产亚洲免费视频| 久久免费看少妇高潮| 国产精品夜夜夜一区二区三区尤| 久久激五月天综合精品| 国产日产欧美一区二区三区 | 一区二区三区欧美久久| 精品国产乱码久久久久久影片| 亚洲免费综合| 欧美另类女人|