日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:225日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产伊人久久| 99国产精品99久久久久久粉嫩| 亚洲一区二区三区四区电影| 免费精品视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 蜜臀91精品一区二区三区| 亚洲日本在线观看视频| 午夜天堂精品久久久久| 日本在线视频一区二区| 欧美日韩1区| 国产精品2区| 国产videos久久| 日韩不卡免费高清视频| 国产综合亚洲精品一区二| 在线视频精品| 久久国产精品久久久久久电车| 中文字幕av亚洲精品一部二部 | 91成人精品观看| 国产精品久久久久av蜜臀| 久久久久久婷| 蜜桃视频欧美| 亚洲精品麻豆| 久久不卡日韩美女| 欧洲av一区二区| 免费日韩av| 欧美亚洲一区二区三区| 国产成人精品一区二区三区在线| 日韩免费看片| 麻豆精品网站| 国产精品亚洲综合色区韩国| 成人日韩精品| 日韩中文字幕1| 欧美亚洲国产日韩| 97精品一区| 亚洲专区在线| 国产福利资源一区| 日韩av一级| 综合激情网...| 韩国一区二区三区视频| 国户精品久久久久久久久久久不卡| 在线精品一区二区| 麻豆国产精品视频| 99久精品视频在线观看视频| 中文字幕视频精品一区二区三区| 亚洲尤物av| 捆绑调教美女网站视频一区 | 久久不见久久见国语| 日韩欧美一区二区三区在线观看 | 另类欧美日韩国产在线| 成人综合一区| 久久国产精品久久久久久电车| 免费国产亚洲视频| 在线成人动漫av| 精品一区在线| 人人爱人人干婷婷丁香亚洲| 日韩一区二区在线免费| 亚洲欧美在线综合| 美女在线视频一区| 91精品久久久久久久久久不卡| 夜夜精品视频| 国产美女精品视频免费播放软件| 久久在线免费| 日韩在线成人| 国产欧美日韩在线一区二区 | 欧美99久久| 日韩有码av| 精品国产黄a∨片高清在线| jiujiure精品视频播放| 美女久久一区| 麻豆免费精品视频| 欧美日韩国产一区二区三区不卡 | 国产精品香蕉| 久久国产欧美| 日韩一二三区在线观看| 国产资源在线观看入口av| 中文国产一区| 久久99国产精品视频| 香蕉国产精品| 欧美亚洲精品在线| 国产精品综合色区在线观看| 日韩毛片视频| 青青草精品视频| 神马久久午夜| 日韩不卡手机在线v区| 国产91在线精品| 久久香蕉精品| 欧美精品97| 日韩在线一区二区| 综合日韩av| 欧美a级一区二区| 日韩精品第二页| 免费人成精品欧美精品| 久久精品国产亚洲夜色av网站| 久久久91麻豆精品国产一区| 日韩精品一区二区三区中文在线| 亚洲免费黄色| 欧美色图国产精品| 国产美女高潮在线观看| 国产精品永久| 日韩午夜视频在线| 午夜在线播放视频欧美| 久久久久久久久丰满| 欧美国产小视频| 美女免费视频一区| 国产精品入口久久| 国产亚洲一区| 日本视频在线一区| 日韩精品亚洲专区在线观看| 伊人久久大香伊蕉在人线观看热v| 亚洲免费激情| 91高清一区| 欧美日韩国产在线观看网站| 欧美一区三区| 婷婷亚洲五月色综合| 久久久久久久久丰满| 午夜影院一区| 蜜桃视频在线网站| 日韩在线欧美| 色88888久久久久久影院| 五月天av在线| 色综合www| 久久在线免费| 欧美手机在线| 亚洲精品1区| 鲁大师影院一区二区三区| 国产亚洲一级| 先锋影音久久久| 亚洲色图网站| 日本精品国产| 久久国产精品美女| 国产精品日韩精品中文字幕| 国产精品videossex| 久久中文字幕一区二区| 国产在线一区不卡| 日本在线高清| 亚洲手机视频| 亚洲一区二区三区四区五区午夜| 久热精品在线| 欧美日韩亚洲一区| 精品一区二区三区亚洲| 国产在线看片免费视频在线观看| 久久婷婷av| 美女精品在线观看| 日本aⅴ亚洲精品中文乱码| 欧美精品二区| 日韩中文在线电影| 伊人成人网在线看| 日韩精品福利一区二区三区| 美女精品久久| 丝袜av一区| 免费人成网站在线观看欧美高清| 日本精品一区二区三区在线观看视频 | 在线观看亚洲精品福利片| 日韩福利视频网| 久久精品国产久精国产爱| 亚洲成av人片一区二区密柚| 视频一区免费在线观看| 日本欧美大码aⅴ在线播放| 精品国产亚洲一区二区三区| 久久精品99久久无色码中文字幕| 乱人伦精品视频在线观看| 欧美日韩 国产精品| 97精品一区| 久久av一区| 久久超碰99| 美女网站一区| 国产日韩亚洲| 日本精品影院| 日韩有码av| 久久男人av资源站| 在线国产日韩| 欧美激情国产在线| 亚洲作爱视频| 国产精品magnet| 亚洲电影在线一区二区三区| 91精品麻豆| 色婷婷狠狠五月综合天色拍| 婷婷久久免费视频| 午夜影院一区| 日韩中文字幕一区二区高清99| 成人亚洲精品| 亚洲专区视频| 欧美aa一级| 欧美日韩亚洲一区在线观看| 天堂日韩电影| 欧美日本不卡| 91精品91| 久久99偷拍| 午夜在线播放视频欧美| 国产一区二区三区视频在线| 三级欧美在线一区| 国产一二在线播放| 日本一区二区三区视频在线看| 国产欧美一区二区三区精品酒店 | 国产美女撒尿一区二区| 午夜欧美精品| 成人在线视频区| 日韩av一区二区三区| 不卡视频在线| 精品72久久久久中文字幕|