設計模式 命令模式

2021-08-30 13:22:04 字數 2034 閱讀 1647

在軟體開發過程中,經常需要在乙個物件中呼叫另外乙個物件的方法去執行某種操作,但是呼叫方可能需要執行不同物件的方法;這時候可以考慮使用命令模式,來減少呼叫方和執行方的耦合,讓呼叫方不用關注具體的執行方是誰,也不需要關注具體的實現;命令模式的主要特點就是通過引入command物件,使得命令的呼叫方和具體執行方解耦;

1.組成結構

命令的呼叫方,就是誰要來執行操作的,它通過command物件來執行命令,會持有乙個command的引用,如果是批量處理命令的話,會有乙個command 佇列的引用;

2>command

抽象命令類,包含乙個execute方法用來執行命令;在invoker中會進行呼叫execute方法;

3>concretecommand

具體的命令類,實現了command抽象類的execute方法,會呼叫receiver.action方法來完成命令的執行;

4>receiver

命令的執行者,來執行命令的具體的操作的;會有乙個action方法,被concretecommand來呼叫;

具體的**

1.invoker

public class invoker 

public void dosomething()

}

2.抽象command

public abstract class command
3.concretecommand

public class concretecommanda extends command 

@override

public void execute()

}

4.receiver

public class receiver 

}

2. 理解

為什麼要通過command來做乙個中間類,而不是直接在invoker類中呼叫receiver的action方法執行對應的操作哪?主要是為了解耦;如果直接呼叫就耦合了

invoker invoker = new invoker(receiver)

invoker.dosomething()

這樣的話,如果說invoker要呼叫其他的操作就不行了;通過引入command,可以注入不同的具體的command來執行操作,系統的靈活性大大提公升;舉個例子比如有個設定快捷鍵的功能,針對某乙個快捷鍵a,可以設定為列印,也可以設定為刪除,複製等操作;我們就可以把這些操作抽象成命令,這樣的話,可以隨便設定,而不固定於某一種操作;這就是命令模式的優點所在;另外命令模式也可以實現批處理的命令執行,這時候需要把呼叫方invoker中新增乙個command佇列的引用;

class commandqueue   

public void removecommand(command command)

//迴圈呼叫每乙個命令物件的execute()方法

public void execute()

} }

class invoker   

//設值注入

public void setcommandqueue(commandqueue commandqueue)

//呼叫commandqueue類的execute()方法

public void call()

}

總結:命令模式的優點有

1>降低系統的耦合性,通過引入了乙個command,解耦了命令的呼叫方和執行方;

2>新的命令可以很方便的加入到系統中,擴充套件性很好,直接新增command的具體實現即可;

3>可以很容易的實現佇列,請求的撤銷和恢復;

當然缺點就是引入了大量的類,每增加一種命令的操作就引入了乙個新的類去處理

設計模式 命令設計模式

一句話總結 命令設計模式的實質是將命令定義,命令的執行分離開,從而提公升了系統的解藕性 結構 命令的抽象command 命令的具體實現concretecommand 命令處理者抽象ireceiver 命令處理者的具體實現concretereceiver 命令的呼叫者invoker 客戶端client...

設計模式 命令模式

1 命令模式的角色組成 1 命令角色 command 生命執行操作的介面。介面或抽象類來實現。2 具體命令角色 concrete command 將乙個接收者物件繫結於乙個動作 呼叫接收者相應的操作,以實現命令角色宣告的執行操作的介面。3 客戶角色 client 建立乙個具體命令物件 並可以設定它的...

設計模式 命令模式

1 command.h ifndef command h define command h include include include using namespace std class chef 廚師,具體命令的執行者 class command 命令基類 class makemuttonco...