設計模式-命令模式(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)是一種設計模式,它嘗試以物件來代表實際行動。命