常用設計模式之命令模式

2021-07-11 17:53:08 字數 2015 閱讀 6417

命令模式的概念:將乙個請求封裝為乙個物件,從而使你可用不同的請求對客戶進行引數化;讓封裝的這個物件可以對請求排隊或記錄請求日誌,以及支援可撤銷的操作。

通俗點:命令模式的本質是對命令進行封裝,將發出命令的責任和執行命令的責任分割開。

/**

* 抽象命令

* 也可以是命令的介面

*/public

abstract

class

command

/**

* 呼叫者

* invoker用於要求該命令執行這個請求

*/public

class

invoker

public

void

executecommand()

}

/**

* 接收者

* 該類知道如何實行乙個與請求相關的操作

* 任何類都可能作為乙個接收者

*/public

class

receiver

public

void

actionb()

}

/**

* 具體命令a

* concretecommand類將乙個接受者物件繫結到乙個動作,呼叫接收者相應的操作,以便實現執行方法(execute)

*/public

class

commanda

extends

command

@override

public

void

execute()

}

接下來測試執行:

private

void

test()

如果我們還需要新增乙個命令(commandb),只需要這樣做。

public

class

commandb

extends

command

@override

public

void

execute()

}//執行

private

void

test()

對於命令模式來說,命令接受者(receiver )中定義了很多方法。舉個栗子:

1,命令接受者(receiver )就像乙個遙控器。其中有加音量的方法(commanda),跳頻道的方法(commandb)等等。

2,當我們拿起遙控器的時候,就相當於例項化了乙個遙控器commanda()物件,並把加音量,跳頻道的方法放在了遙控器裡面。

3,當我們手指按下加音量按鍵的時候就相當於例項化了乙個invoker()命令控制物件,把加音量這個具體命令放進去了。

4,按鍵按下的時候就傳送了加音量的命令(invoker.executecommand();)

也就是說,receiver 中包含了所有供外部呼叫的方法。但是這個類不允許外部呼叫,建立乙個命令類供外部發出命令,命令執行receiver 的哪些方法。

這樣,有助於記錄某步操作具體執行了哪些方法。並且可以選擇哪些命令可以執行可以過濾。

所以,我們來總結一下命令模式的作用:

1,比較容易的設計出乙個命令佇列

2,在需要的情況下可以將命令記錄下來

3,允許接收請求的一方決定是否拒絕請求

4,很容易對請求實現撤銷和重做

5,加入新的具體命令不會影響其他類,容易加入新的具體命令類

總結:把請求操作的物件與執行操作的物件分割開,每乙個命令都是乙個操作:請求的一方發出請求,要求執行乙個操作;接收的一方收到請求,並執行操作。

設計模式之命令設計模式

先來看一下命令模式的類圖 乍一看好像類很多,其實我們逐個分析他們。類圖中存在的類可以分為 invoker icommand conceretecommand receiver invoker類 上層直接調取invoker類 icommand 是對命令的抽象 conceretecommand 是命令的...

設計模式之命令模式

command pattern 將請求封裝成物件,這可以讓你使用不同的請求,佇列,或者是日誌請求來引數化其他物件,命令模式也可以支援撤銷操作。命令模式有兩種實現方式 1.在命令管理器中提供設定當前命令接受者的方法,當執行訊息或者是有訊息壓入的時候直接將命令傳送給當前設定的接受者。2.在命令管理器中建...

設計模式之命令模式

當我們有一台多功能的印表機,然後通過電腦直接進行任務,如圖 如果通過這樣的設計直接去呼叫多功能一體機的功能,就會存在此時此刻只能進行乙個任務,不允許有多個客戶端同時操作.那麼現在我們就需要考慮一種新的設計模式,叫做命令設計模式。命令設計模式 將乙個請求封裝為乙個物件,從而使你可用不同的請求對客戶進行...