PHP設計模式之命令模式

2022-06-05 13:30:09 字數 3942 閱讀 9613

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

gof定義:將乙個請求封裝為乙個物件,從而使你可用不同的請求對客戶進行引數化;對請求排隊或記錄請求日誌,以及支援可撤消的操作

gof類圖

**實現

class invoker

public function exec()

}

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

abstract class command

abstract public function execute();

}class concretecommand extends command

}

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

class receiver

public function action()

}

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

// 準備執行者

$receivera = new receiver('a');

// 準備命令

$command = new concretecommand($receivera);

// 請求者

$invoker = new invoker($command);

$invoker->exec();

客戶端的呼叫,我們要聯絡好運行者也就是挑有好廚子的飯館(receiver),然後準備好命令也就是選單(command),最後交給服務員(invoker)。

完整**:

<?php 

class invoker

public function exec()}}

public function undo()}}

}abstract class command

abstract public function execute();

}class concretecommand extends command

else

}public function undo()

else

}}class receiver

public function action()

public function undo()

}// 準備執行者

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

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

完整**:

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

簡訊傳送類圖

完整原始碼:

<?php 

class sendmsg

public function send($msg)

}}abstract class command

abstract public function execute($msg);

}class sendaliyun extends command

}}class sendjiguang extends command

}}class sendaliyunmsg

}class sendaliyunpush

}class sendjiguangmsg

}class sendjiguangpush

}$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('這次要搞個大活動,快來註冊吧!!');

說明

b站id:48278053

PHP設計模式之命令模式

將來自客戶端的請求傳入乙個物件,從而使你可用不同的請求對客戶進行引數化。用於 行為請求者 與 行為實現者 解耦,可實現二者之間的松耦合,以便適應變化。如下 header content type text html charset uft 8 命令模式 inte ce validator 命令介面 ...

設計模式之命令模式 php實現命令模式

命令模式就是把命令封裝成物件。將乙個請求封裝為物件,從而使你可用不同的請求對客戶進行引數化 對請求排隊或記錄日誌,以及支援可撤銷的操作。命令模式有哪些好處呢?命令模式把請求乙個操作的物件和直到怎麼執行乙個操作的物件分隔開。比如服務員把操作的請求者客戶和操作的執行者廚師分離開,把客戶的命令傳遞給廚師。...

php設計模式之命令鏈模式

1.命令連模式可以使用在使用者登陸註冊的時候處理不同角色使用者的業務邏輯,與變數值 command inte ce inte ce mycommand user register class register public function runcommand name,args common l...