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

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

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

瀏覽:229日期: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久久精品费精品国产| 日本麻豆一区二区三区视频| 日韩深夜视频| 亚洲久久一区| 日本免费一区二区三区四区| 日韩有码av| 999久久久精品国产| 日本在线成人| 久久久久99| 日韩国产一二三区| 黑人精品一区| 日韩av黄色在线| 欧美亚洲激情| 国产精品.xx视频.xxtv| 亚洲一区二区三区免费在线观看| 精品一区二区三区中文字幕在线| 99国产成+人+综合+亚洲欧美| 美女久久久久久| 蜜臀91精品一区二区三区| 水蜜桃精品av一区二区| 97精品国产99久久久久久免费| 欧美色图国产精品| 日韩高清在线不卡| 欧美综合另类| 久久精品日韩欧美| 日韩精品免费视频一区二区三区 | 综合国产在线| 亚洲伊人av| 国产精品亚洲产品| 亚洲精选成人| 夜久久久久久| 亚洲1234区| 国产精品扒开腿做爽爽爽软件| 精品日产乱码久久久久久仙踪林| 视频在线不卡免费观看| 麻豆精品在线播放| 免费在线欧美黄色| 中文字幕一区久| 婷婷综合社区| 久久毛片亚洲| 久久久91麻豆精品国产一区| 日本中文字幕视频一区| 亚洲精品99| 欧美aa一级| 久久免费精品| 久久精品999| 亚洲免费专区| 免费观看久久久4p| 欧美精品一区二区三区精品| 久久久男人天堂| 免费一级欧美在线观看视频 | 高潮久久久久久久久久久久久久| 欧美日韩亚洲一区三区| 亚洲有吗中文字幕| 亚洲免费婷婷| 中文亚洲免费| 99国产精品久久久久久久成人热 | 久久国产高清| 成人av二区| 国产在线欧美| 久久国产主播| 成人在线视频中文字幕| 国产精品大片| 美女视频网站久久| 国产精品中文字幕亚洲欧美| 青青伊人久久| 欧美午夜网站| 国产日韩欧美三级| 国产精品亚洲成在人线| 国产精品久久久久久久久免费高清| 日本中文字幕不卡| 亚洲精品在线a| 亚洲tv在线| 天堂精品久久久久| 日本免费在线视频不卡一不卡二| 综合激情在线| 91在线成人| 国产精品亚洲二区| 精品国产亚洲日本| av最新在线| 色在线中文字幕| 成人免费电影网址| 欧美亚洲国产激情| 欧美在线综合| 影音先锋久久精品| 91精品国产自产在线丝袜啪| 亚洲精品欧美| 国产精品久久久网站| 国产精品99一区二区三区| 成人亚洲一区| 三级精品视频| 亚洲在线免费| 日韩一区二区三免费高清在线观看 | 日本中文字幕视频一区| 日韩av影院| 你懂的亚洲视频| 国产一区福利| 视频二区不卡| 国产一区成人| 亚洲精品成人一区| 国产免费久久| 不卡一二三区| 影院欧美亚洲| 日本成人中文字幕| 久久99蜜桃| av高清不卡| 石原莉奈一区二区三区在线观看| 日本强好片久久久久久aaa| 国产精品调教| 成人福利av| 亚洲欧洲一区二区天堂久久| 蜜桃视频在线观看一区| 欧美aaaaaa午夜精品| 日韩精品一区二区三区免费观影 | 国产欧美成人| 在线天堂中文资源最新版| 久久精品国产亚洲夜色av网站| 国产精品日韩| 国产伦精品一区二区三区视频 | 九色精品91| 日韩av中文在线观看| 麻豆精品99| 国产视频一区三区| 青青草国产成人99久久| а√天堂8资源中文在线| 午夜视频精品| 国产乱人伦丫前精品视频| 日韩免费在线| 亚洲精品日本| аⅴ资源天堂资源库在线| 一二三区精品| 国产a亚洲精品| 蜜桃伊人久久| 精品欧美视频| 日韩中文字幕不卡| 国产一区福利| 视频一区视频二区中文字幕| 高清日韩中文字幕| 一区二区日韩免费看| 亚洲精品福利电影| 亚洲婷婷丁香| 亚洲91久久| 国产精选一区| 伊人影院久久| 日韩久久一区二区三区| 91精品国产自产观看在线| 激情综合自拍| 粉嫩av一区二区三区四区五区 | 亚洲三级国产| www成人在线视频| 国产精品一区二区三区av| 欧美精品羞羞答答| 中文在线免费视频| 国产日韩亚洲欧美精品| 模特精品在线| 久久精品1区| 麻豆精品视频在线| 日韩av资源网| 视频一区欧美日韩| 婷婷成人在线| 色网在线免费观看| 久久av免费看| 日韩中文字幕无砖| 在线综合欧美| 群体交乱之放荡娇妻一区二区| 国产福利亚洲| 91成人在线精品视频| 在线亚洲一区| 久久久久国产一区二区| 精品视频在线观看网站| 国产日产一区| 天海翼精品一区二区三区| 亚洲深爱激情| 91久久国产| 成人在线网站| 欧美成a人免费观看久久| 精品国产精品国产偷麻豆| 国产日韩欧美一区在线| 日本亚洲视频在线| 亚洲2区在线| 日韩欧美在线精品| 亚洲一级大片| 美女精品网站| 欧美日韩国产免费观看| 久久青草久久| 三级小说欧洲区亚洲区| а√天堂中文在线资源8| 久久天堂影院| 国产精品大片| 久久三级中文| 日韩a一区二区| 国产传媒在线观看| 国产精品亚洲一区二区三区在线观看| 欧美好骚综合网| 日本激情一区| av资源亚洲|