【設計模式In Java】十三、命令模式

命令模式

定義

命令模式(Command Pattern):將一個請求封裝爲一個對象,從而讓我們可用不同的請求對客戶進行參數化;對請求排隊或者記錄請求日誌,以及支持可撤銷的操作。命令模式是一種對象行爲型模式,其別名爲動作(Action)模式或事務(Transaction)模式。

場景

開發一個Android App,定義了很多手勢操作,比如單指左滑右滑、單擊雙擊、雙指上滑下滑等,這些手勢操作會在多種組件上生效,比如圖片、文本、容器等,並且以後可能新增更多的命令,並且一個手勢操作可能同時在多個組件上生效。

UML類圖

在這裏插入圖片描述

代碼

command
示例:


public class TestCommand {

    @Test
    public void test() {
        new TextView(Collections.singletonList(new LongPress(new ContextMenuHandler()))).apply();
        System.out.println();
        new ImageView(Collections.singletonList(new LongPress(new PhotoGalleryHandler()))).apply();
    }
	/*
    Command from TextView...
    Invoke gesture LongPress...
    Handle LongPress...
    Display context menu...
    
    Command from ImageView...
    Invoke gesture LongPress...
    Handle LongPress...
    Display photo gallery...
     */
}

總結

咋一看起來好像是多個維度的變化,直接使用橋接模式即可,至於可能出現需要同時在多個組件上生效的場景,完全可以將橋接實現部分的引用變成一個集合。但區別在於橋接模式實現類的行爲卻不能再擴展,客戶端可以自由組合兩個維度,但維度一旦組合就意味着行爲已經確定。命令模式對其中一個維度的行爲繼續抽象,可以理解爲這個維度又是一個橋接模式,客戶依然可以隨意連接兩個維度,但是其中一個維度的行爲卻可以另外指定,相當於是三個維度的橋接模式,橋接模式注重維度關係,命令模式注重行爲:調用者、命令、接受者這三個維度可以自由變化,兩種模式的使用場景是不同的。

上面的實現方式是和組合模式結合起來的,一個命令可以是由多個命令組和起來的,這樣一組命令也可以叫做命令隊列或宏命令。

命令模式是一種使用頻率非常高的設計模式,它可以將請求發送者與接收者解耦,請求發送者通過命令對象來間接引用請求接收者,使得系統具有更好的靈活性和可擴展性。在基於GUI的軟件開發,無論是在電腦桌面應用還是在移動應用中,命令模式都得到了廣泛的應用。

主要優點:

  • 降低系統的耦合度。由於請求者與接收者之間不存在直接引用,因此請求者與接收者之間實現完全解耦,相同的請求者可以對應不同的接收者,同樣,相同的接收者也可以供不同的請求者使用,兩者之間具有良好的獨立性。
  • 新的命令可以很容易地加入到系統中。由於增加新的具體命令類不會影響到其他類,因此增加新的具體命令類很容易,無須修改原有系統源代碼,甚至客戶類代碼,滿足“開閉原則”的要求。
  • 可以比較容易地設計一個命令隊列或宏命令(組合命令)。
  • 爲請求的撤銷(Undo)和恢復(Redo)操作提供了一種設計和實現方案。

主要缺點:

  • 使用命令模式可能會導致某些系統有過多的具體命令類。因爲針對每一個對請求接收者的調用操作都需要設計一個具體命令類,因此在某些系統中可能需要提供大量的具體命令類,這將影響命令模式的使用。

適用場景:

  • 系統需要將請求調用者和請求接收者解耦,使得調用者和接收者不直接交互。請求調用者無須知道接收者的存在,也無須知道接收者是誰,接收者也無須關心何時被調用。
  • 系統需要在不同的時間指定請求、將請求排隊和執行請求。一個命令對象和請求的初始調用者可以有不同的生命期,換言之,最初的請求發出者可能已經不在了,而命令對象本身仍然是活動的,可以通過該命令對象去調用請求接收者,而無須關心請求調用者的存在性,可以通過請求日誌文件等機制來具體實現。
  • 命令執行過程可以被記錄,當系統需要支持命令的撤銷(Undo)操作和恢復(Redo)操作時,可以從這些記錄中恢復。
  • 系統需要將一組操作組合在一起形成宏命令。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章