淺談PHP設計模式的命令模式

来源:https://www.cnblogs.com/phpphp/archive/2022/11/09/16874842.html
-Advertisement-
Play Games

簡介: 命令模式,又稱之為動作模式或者事務模式,屬於行為型的設計模式。 將不同的請求封裝成不同的請求對象,以便使用不同的請求; 角色都會用飯館來舉例子: 命令下達者:顧客 命令接受者:服務員 命令本身: 菜單 命令執行者:廚師 適用場景: Laravel的事件調度機制有用到了命令模式。 想要解耦服務 ...


簡介:

命令模式,又稱之為動作模式或者事務模式,屬於行為型的設計模式。
將不同的請求封裝成不同的請求對象,以便使用不同的請求;
角色都會用飯館來舉例子:
命令下達者:顧客
命令接受者:服務員
命令本身: 菜單
命令執行者:廚師

適用場景:

  1. Laravel的事件調度機制有用到了命令模式。
  2. 想要解耦服務端和調用端的時候。

優點:

  1. 當去修改命令的時候,直接與命令接受者進行通信,實現了客戶端的命令發起與服務端命令執行者的解耦。
  2. 擴展性好,增加新的命令,既不會影響調用端,也方便服務端的擴展。

缺點:

增加類的數量進而增加複雜度。

代碼:

//命令角色的抽象介面
interface CommandInterface {
    public function execute();
}

//命令角色(類似於菜單)
class PrintCommand implements CommandInterface {
    private $receiver;

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

    public function execute() {
        $this->receiver->exec('Hello World');
    }
}



//執行者(類似於初始)
class Receiver {
    public function exec(string $str) {
        echo $str;
    }
}


//命令接受者(類似於服務員)
class Invoker {
    private $command;

    public function setCommand(CommandInterface $cmd) {
        $this->command = $cmd;
    }

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



//調用端==========================================================
$receiver = new Receiver();
$invoker = new Invoker();
$invoker->setCommand(new PrintCommand($receiver));
$invoker->run();

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以下這個例子非常好的闡述了父子類同時存在時靜態代碼塊/靜態變數初始化,普通代碼塊/普通成員變數初始化,構造器之間的具體運行順序。 註意,在構造器開頭,我們可以看作按順序隱藏了以下兩行關鍵執行步驟: super(); 普通代碼塊和普通屬性的初始化... 具體例子如下,運行順序在代碼註釋中以數字括弧給出 ...
  • 前段時間公司一直要求進行只是梳理,整合,想著做一套知識管理系統,在gitee上找到了一個開源的項目管理系統,帶的有知識庫管理子系統,索性就拿來使用了; gitee地址 https://gitee.com/gouguopen/dev.git 【非廣告推廣】解決公司實際需要 我這個部署到本地了,使用集成 ...
  • 簡述 將各個功能拆分後分別封裝(各功能解耦),需要時可自由組合(包括執行順序) 話不多說,看個優化案例吧。 優化案例 最初版 以下是模擬客戶端想服務端發送請求的業務流程。 客戶端調用代碼如下。 // 客戶端 public class Client { public static void main( ...
  • 前言 大家早好、午好、晚好吖~ 這不光棍節快到了,表弟準備寫一封情書給他的女神,想在光棍節之前脫單。 為了提高成功率,於是跑來找我給他參謀參謀,本來我是不想理他的。 不過誰讓他是我表弟呢(請我洗jio),於是教給他程式員的終極浪漫絕招 先假裝給女神拍照,然後再把情書寫到她的照片上列印出來送給她,嘿嘿 ...
  • HTTP協議 1.什麼是HTTP協議? 超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用廣泛的一種網路協議。是工作在tcp/ip協議基礎上的,所有的www文件都遵守這個標準 http1.0 短連接 http1.1 長連接 HTTP是TCP/IP協議的一 ...
  • “心有所向,日復一日,必有精進” 前言: 想必大家看完我之前寫的搭建redis伺服器,大家都已經把redis搭建起來了吧~如果沒有搭建起來的小可愛請移步這裡哦~[從0到1搭建redis6](https://www.cnblogs.com/qsmm/p/16871488.html "從0到1搭建red ...
  • 文章有點長,我決定用半個小時來和你分享~😂 廢話不多說,上代碼。。。 基於Seata 1.5.2,項目中用 seata-spring-boot-starter 1. SeataDataSourceAutoConfiguration SeataDataSourceAutoConfiguration ...
  • 1、開發文檔 微信開發文檔:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1 安全規範:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3 1、簽名演算法 (簽 ...
一周排行
    -Advertisement-
    Play Games
  • 下麵是一個標準的IDistributedCache用例: public class SomeService(IDistributedCache cache) { public async Task<SomeInformation> GetSomeInformationAsync (string na ...
  • 這個庫提供了在啟動期間實例化已註冊的單例,而不是在首次使用它時實例化。 單例通常在首次使用時創建,這可能會導致響應傳入請求的延遲高於平時。在註冊時創建實例有助於防止第一次Request請求的SLA 以往我們要在註冊的時候實例單例可能會這樣寫: //註冊: services.AddSingleton< ...
  • 最近公司的很多項目都要改單點登錄了,不過大部分都還沒敲定,目前立刻要做的就只有一個比較老的項目 先改一個試試手,主要目標就是最短最快實現功能 首先因為要保留原登錄方式,所以頁面上的改動就是在原來登錄頁面下加一個SSO登錄入口 用超鏈接寫的入口,頁面改造後如下圖: 其中超鏈接的 href="Staff ...
  • Like運算符很好用,特別是它所提供的其中*、?這兩種通配符,在Windows文件系統和各類項目中運用非常廣泛。 但Like運算符僅在VB中支持,在C#中,如何實現呢? 以下是關於LikeString的四種實現方式,其中第四種為Regex正則表達式實現,且在.NET Standard 2.0及以上平... ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他們的程式記憶體會偶發性暴漲,自己分析了下是非托管記憶體問題,讓我幫忙看下怎麼回事?哈哈,看到這個dump我還是非常有興趣的,居然還有這種游戲幣自助機類型的程式,下次去大玩家看看他們出幣的機器後端是不是C#寫的?由於dump是linux上的程式,剛好win ...
  • 前言 大家好,我是老馬。很高興遇到你。 我們為 java 開發者實現了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何處理的,可以參考我的另一個項目: 手寫從零實現簡易版 tomcat minicat 手寫 ngin ...
  • 上一次的介紹,主要圍繞如何統一去捕獲異常,以及為每一種異常添加自己的Mapper實現,並且我們知道,當在ExceptionMapper中返回非200的Response,不支持application/json的響應類型,而是寫死的text/plain類型。 Filter為二方包異常手動捕獲 參考:ht ...
  • 大家好,我是R哥。 今天分享一個爽飛了的面試輔導 case: 這個杭州兄弟空窗期 1 個月+,面試了 6 家公司 0 Offer,不知道問題出在哪,難道是杭州的 IT 崩盤了麽? 報名面試輔導後,經過一個多月的輔導打磨,現在成功入職某上市公司,漲薪 30%+,955 工作制,不咋加班,還不捲。 其他 ...
  • 引入依賴 <!--Freemarker wls--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.30</version> </dependency> ...
  • 你應如何運行程式 互動式命令模式 開始一個互動式會話 一般是在操作系統命令行下輸入python,且不帶任何參數 系統路徑 如果沒有設置系統的PATH環境變數來包括Python的安裝路徑,可能需要機器上Python可執行文件的完整路徑來代替python 運行的位置:代碼位置 不要輸入的內容:提示符和註 ...