1. 程式人生 > >設計模式-命令模式(Command)

設計模式-命令模式(Command)

概述

  • 定義 : 將"請求"封裝成物件, 以便使用不同的請求
  • 命令模式解決了應用車鞥徐中物件的職責以及它們之間的通訊方式
  • 型別 : 行為型

適用場景

  • 請求的呼叫者和請求的接收者需要解耦, 使得呼叫者和接收者不直接互動
  • 需要抽象出等待執行的行為

優點

  • 降低耦合
  • 容易擴充套件新命令或者一組命令

缺點

  • 命令的無限擴充套件會增加類的數量, 提高系統實現的複雜度

模式角色

  • Command : 宣告執行操作的介面。

  • ConcreteCommand :

    • 將一個接收者物件綁定於一個動作
    • 呼叫接收者相應的操作,以實現Excute
  • Invoker : 要求該命令執行這個請求。可以理解為下達命令的物件, 有時候可以省略直接讓Client擔任這個角色

  • Receiver : 知道如何實施與執行一個請求相關的操作。任何類都可能作為一個接收者。

  • Client : 建立一個具體命令物件並設定它的接收者。

程式碼實現

業務場景

以開燈關燈為例, 類與命令模式中角色對應如下:

  • Command介面 : 對應模式中Command介面
  • LighetOnCommand, LightOffCommand : 對應模式中ConcreteCommand角色
  • Person : 對應模式中Invoker角色
  • Light : 對應模式中Receiver角色
  • Client : 對應模式中Client角色, 測試程式碼

完整UML類圖

省略了Client測試類的類圖:
在這裡插入圖片描述

程式碼

Command介面 :

/**
 * 命令介面
 *
 * @author 七夜雪
 * @create 2018-11-24 18:17
 */
public interface Command {

    public void excute();
}

LighetOnCommand, LightOffCommand :

/**
 * @author 七夜雪
 * @create 2018-11-24 18:20
 */
public class LightOffCommand implements Command {

    private Light light;

    public
LightOffCommand(Light light) { this.light = light; } @Override public void excute() { light.lightOff(); } }
/**
 * 開燈命令
 *
 * @author 七夜雪
 * @create 2018-11-24 18:18
 */
public class LightOnCommand implements Command {
    private Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void excute() {
        light.lightOn();
    }
}

Person :

import java.util.ArrayList;
import java.util.List;

/**
 * 命令模式中的Invoker
 *
 * @author 七夜雪
 * @create 2018-11-24 18:21
 */
public class Person {
    private static List<Command> commands = new ArrayList<>();

    private Person() {
    }

    public static void excute(){
        for (Command command : commands) {
            command.excute();
        }
        commands.clear();
    }

    public static void addCommand(Command command){
        commands.add(command);
    }

    public static void removeCommand(Command command){
        commands.remove(command);
    }

}

Light :

/**
 * 命令模式中的Receiver
 *
 * @author 七夜雪
 * @create 2018-11-24 18:18
 */
public class Light {

    public void lightOn(){
        System.out.println("開燈...");
    }

    public void lightOff(){
        System.out.println("關燈...");
    }

}

Client :

/**
 * 測試類
 *
 * @author 七夜雪
 * @create 2018-11-24 18:29
 */
public class Client {

    public static void main(String[] args) {
        Light light = new Light();
        Command on = new LightOnCommand(light);
        Command off = new LightOffCommand(light);
        Person.addCommand(on);
        Person.addCommand(off);
        Person.excute();
    }

}

本文參考:
慕課網<java設計模式精講 Debug 方式+記憶體分析>課程
四人幫<設計模式>

相關推薦

重走Java設計模式——命令模式Command Pattern)

命令模式 定義 命令模式(Command Pattern)是一種資料驅動的設計模式,它屬於行為型模式。請求以命令的形式包裹在物件中,並傳給呼叫物件。呼叫物件尋找可以處理該命令的合適的物件,並把該命令傳給相應的物件,該物件執行命令。 命令模式設計角色

設計模式-命令模式Command

命令模式:將一個請求封裝為一個物件,從而可用不同的請求對客戶進行引數化;對請求排隊或記錄日誌,以及支援可撤銷的操作,將”發出請求的物件”和”接收與執行這些請求的物件”分隔開來。   角色和職責: 1.Command:    宣告執行操作的介面 2.Concrete Co

設計模式-命令模式(Command)

概述 定義 : 將"請求"封裝成物件, 以便使用不同的請求 命令模式解決了應用車鞥徐中物件的職責以及它們之間的通訊方式 型別 : 行為型 適用場景 請求的呼叫者和請求的接收者需要解耦, 使得呼叫者

深入淺出設計模式——命令模式Command Pattern)

轉載自:https://www.cnblogs.com/Bobby0322/p/4195240.html 模式動機 在軟體設計中,我們經常需要向某些物件傳送請求,但是並不知道請求的接收者是誰,也不知道被請求的操作是哪個,我們只需在程式執行時指定具體的請求接收者即可,此

設計模式(行為型模式) ----- 命令模式Command

命令模式很好理解,舉個例子,司令員下令讓士兵去幹件事情,從整個事情的角度來考慮,司令員的作用是,發出口令,口令經過傳遞,傳到了士兵耳朵裡,士兵去執行。這個過程好在,三者相互解耦,任何一方都不用去依賴其他人,只需要做好自己的事兒就行,司令員要的是結果,不會去關注到

設計模式 —— 命令模式Command Pattern)

命令模式(Command Pattern) 概念: 概述:在軟體設計中,我們經常會遇到某些物件傳送請求,然後某些物件接受請求後執行,但傳送請求的物件可能並不知道接受請求的物件是誰,執行的是什麼動作。此時可通過 命令模式 來實現,讓傳送者和接受者完全

C# 設計模式-命令Command

將一個請求封裝為一個物件,達到用不同請求對客戶進行引數化。呼叫者通過某個命令來呼叫接收者執行相關操作,減弱呼叫者與接收者的耦合度。 主要組成: Command-命令父類或介面 ConcreteComm

設計模式——命令模式Command Pattern)

一、命令模式的定義 將“請求”封裝成物件,以便使用不同的請求,佇列或者日誌來引數化其他物件。命令模式也支援可撤銷。 命令介面–ICommand public interface ICommand { public void execut

java設計模式——命令模式(Command Pattern)

概述:        在軟體開發中,我們經常需要向某些物件傳送請求(呼叫其中的某個或某些方法),但是並不知道請求的接收者是誰,也不知道被請求的操作是哪個,此時,我們特別希望能夠以一種鬆耦合的方式來設計軟體,使得請求傳送者與請求接收者能夠消除彼此之間的耦合,讓物件之間的呼叫關

設計模式——命令模式(C++實現)

clear cto ive pre urn bak std oot style 1 [root@ ~/learn_code/design_pattern/19_order]$ cat order.cpp 2 #include <

設計模式——命令模式

tro dht asf tmc qdt idt faac tms oba   命令模式屬於對象的行為模式。命令模式又稱為行動(Action)模式或交易(Transaction)模式。   命令模式把一個請求或者操作封裝到一個對象中。命令模式允許系統使用不同的請求把客戶端參數

設計模式-命令模式(行為)、責任鏈模式(行為)

tst 是否 return 執行 mman cpp lap 2.0 兩種 0 命令模式和責任鏈模式 命令模式和責任鏈模式是兩種完全相反的模式。 命令模式是需要將請求排隊處理。因此將請求封裝成對象放入隊列。 而責任鏈模式則是,可能同一對象需要多個函數只有一個函數能處理。或是多

設計模式-命令模式

設計模式 命令模式 class User { public string name { get; set; } public void Action(string command) { Console.WriteLine(

PHP設計模式 - 命令模式

命令 之間 class brush echo 行為 pre 輸出 聲明 命令模式:在軟件系統中,“行為請求者”與“行為實現者”通常呈現一種“緊耦合”。但在某些場合,比如要對行為進行“記錄、撤

設計模式-命令模式(Go語言描述)

在上一篇部落格設計模式-單例模式(Go語言描述)中我們介紹了在golang中如何去實現單例模式,在文章的最後我們也介紹到了golang獨有的一種實現單例的方式-sync.Once.Do(),可以讓golang輕鬆的實現可以應對併發請求的單利.今天我們繼續探索設計模式,來介紹一下命令模式的

用心理解設計模式——命令模式 (Commond Pattern)

前置文章: 用心理解設計模式——設計模式的原則  設計模式相關程式碼已統一放至 我的 Github   一、定義   行為型模式之一。   Encapsulate a request as an object, thereby l

設計模式 --- 命令模式

1.定義 將一個請求封裝成一個物件,從而讓使用者使用不同的請求把客戶端引數化;對請求排隊或者記錄請求日誌,以及支援可撤銷的操作。   2.使用場景 需要抽象出待執行的動作,然後以引數的形式提供出來,類似於過程設計中的回撥機制。 在不同的時刻指定、排列和執行請求。 需

大話設計模式-命令模式

  命令模式 命令模式將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化,對請求排隊或記錄請求日誌,以及支援可撤銷的操作。 對於請求排隊或記錄請求日誌,以及支援可撤銷的操作,行為請求者和行為實現者的緊耦合是不合適的。 命令模式的優點 命令模式能較容易地設計一個命令模式。在

設計模式-行為型模式-命令模式

設計模式-行為型模式-命令模式 基礎 以一個MIS系統為栗子 MIS 管理資訊系統(Management Information System,MIS)是一個以人為主導的,利用計算機硬體、軟體和網路裝置,進行資訊的收集、傳遞、儲存、加工、整理的系統,以提高組織的經營效率。 程式碼如下 pu

設計模式——命令模式(遙控器與燈)

本文首發於cdream的個人部落格,點選獲得更好的閱讀體驗! 歡迎轉載,轉載請註明出處。 本文主要對命令模式進行概述講解,並使用使用遙控器與燈來講述命令模式中呼叫者與接收者的關係。 一、概述 命令模式(英語:Command pattern)是一種設計模式,它嘗試以物件來代表實際行動。命