- 注意!B钤丁E烀健! 如果你是技術(shù)大牛扶欣、技術(shù)大咖,請略過這篇文章避免耽擱您的時間千扶,這篇文章屬于入門級別料祠。??
什么是命令模式?可以從兩個方面去定義
- 將請求封裝成一個對象澎羞,讓讓用戶使用不同的請求將客戶端(使用者)參數(shù)化
- 對請求排隊或者記錄請求日志髓绽,以及支持撤銷操作(說明:就相當(dāng)于我們的終端命令一樣,所有之前使用過的命令妆绞,可以通過上顺呕、下鍵來找到)
- 命令模式的作用:讓程序擴展性更好、降低耦合度
通過一個簡單的原理案例括饶,以理解命令模式的流程(電腦的開機和關(guān)機命令流程)
//命令遵循的協(xié)議
protocol ComputerCommand {
func execute()
}
//具體的命令:Mac電腦開機執(zhí)行命令
class MacStartupCommand: ComputerCommand {
private var macComputer:MacComputer?
//持有接受者(接受這就是Mac電腦了)
init(macComputer:MacComputer) {
self.macComputer = macComputer
}
func execute() {
self.macComputer?.startup()
}
}
//具體命令:Mac電腦關(guān)機命令
class MacShutdownCommand: ComputerCommand {
private var macComputer:MacComputer?
init(macComputer:MacComputer) {
self.macComputer = macComputer
}
func execute() {
self.macComputer?.shutdown()
}
}
//接受者:Mac電腦
class MacComputer: NSObject {
func startup() {
print("Mac 電腦開機")
}
func shutdown() {
print("Mac 電腦關(guān)機")
}
}
//請求者:Mac電腦的請求者
class MacInvoker: NSObject {
//持有Mac電腦的命令對象引用
private var startupCommand:MacStartupCommand?
private var shutdownCommand:MacShutdownCommand?
init(startupCommand:MacStartupCommand,shutdownCommand:MacShutdownCommand)
{
self.startupCommand = startupCommand
self.shutdownCommand = shutdownCommand
}
func startup() {
self.startupCommand?.execute()
}
func shutdown() {
self.shutdownCommand?.execute()
}
}
//==================在ViewController中測試一下命令=============
//命令模式測試一 電腦關(guān)機和開機
//1株茶、創(chuàng)建接受者
let computerReciver = MacComputer()
//2、創(chuàng)建開機關(guān)機命令
let startupCommand = MacStartupCommand(macComputer: computerReciver)
let shutdownCommand = MacShutdownCommand(macComputer: computerReciver)
//3图焰、創(chuàng)建請求者
let invoker = MacInvoker(startupCommand: startupCommand, shutdownCommand: shutdownCommand)
//4启盛、執(zhí)行命令
invoker.startup()
invoker.shutdown()
在客戶端使用的時候就像是敲命令一樣,一步一步的執(zhí)行技羔,很爽吧僵闯。另外命令模式也有很多的變種,不是固定不變的藤滥,這個只是一個簡單的??
- 命令模式有多種優(yōu)化方法鳖粟,也有多種變種(例如命令模式和泛型模式結(jié)合+動態(tài)調(diào)用命令 ——>萬能命令模式)
- 既然是命令模式就要處理命令的并發(fā)問題? 在Swift中可使用GCD隊列同步代碼塊方法解決并發(fā)問題