Java描述設計模式(20):命令模式

来源:https://www.cnblogs.com/cicada-smile/archive/2019/11/18/11885115.html
-Advertisement-
Play Games

本文源碼: "GitHub·點這裡" || "GitEE·點這裡" 一、生活場景 1、場景描述 智能電腦的品牌越來越多,由此誕生了一款電腦控制的APP,萬能遙控器,用戶在使用遙控器的時候,可以切換為自家電視的品牌,然後對電視進行控制。 2、代碼實現 二、命令模式 1、基礎概念 命令模式屬於對象的行為 ...


本文源碼:GitHub·點這裡 || GitEE·點這裡

一、生活場景

1、場景描述

智能電腦的品牌越來越多,由此誕生了一款電腦控制的APP,萬能遙控器,用戶在使用遙控器的時候,可以切換為自家電視的品牌,然後對電視進行控制。

2、代碼實現

public class C01_InScene {
    public static void main(String[] args) {
        TVClient tvClient = new TVClient() ;
        Remote remote = new RemoteApp(tvClient) ;
        UserClient userClient = new UserClient(remote) ;
        userClient.action("HM","換台");
    }
}
/**
 * 遙控介面
 */
interface Remote {
    void controlTV (String tvType,String task);
}
/**
 * 遙控器APP
 */
class RemoteApp implements Remote {
    private TVClient tvClient = null ;
    public RemoteApp (TVClient tvClient){
        this.tvClient = tvClient ;
    }
    @Override
    public void controlTV(String tvType, String task) {
        tvClient.action(tvType,task);
    }
}
/**
 * 用戶端
 */
class UserClient {
    // 持有遙控器
    private Remote remote = null ;
    public UserClient (Remote remote){
        this.remote = remote ;
    }
    public void action (String tvType, String task){
        remote.controlTV(tvType,task);
    }
}
/**
 * 電視端
 */
class TVClient {
    public void action (String tvType, String task){
        System.out.println("TV品牌:"+tvType+";執行:"+task);
    }
}

二、命令模式

1、基礎概念

命令模式屬於對象的行為模式。命令模式把一個請求或者操作封裝到一個對象中。把發出命令的動作和執行命令的動作分割開,委派給不同的對象。命令模式允許請求的一方和接收的一方獨立開來,使得請求的一方不必知道接收請求的一方的介面,更不必知道請求是怎麼被接收,以及操作是否被執行。

2、模式圖解

3、核心角色

  • 命令角色

聲明所有具體命令類的抽象介面。

  • 具體命令角色

定義接收者和行為之間的交互方式:實現execute()方法,調用接收者的相應操作 , 傳遞命令信息。

  • 請求者角色

負責調用命令對象執行請求,相關的方法叫做行動方法。

  • 接收者角色

執行請求。任何一個類都可以成為接收者,執行請求的方法叫做行動方法。

4、源碼實現

public class C02_Command {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Command command = new ConcreteCommand(receiver);
        Invoker invoker = new Invoker(command);
        invoker.action("卧倒");
    }
}
/**
 * 命令角色
 */
interface Command {
    // 執行方法
    void execute(String task);
}
/**
 * 具體命令角色類
 */
class ConcreteCommand implements Command {
    //持有相應的接收者對象
    private Receiver receiver = null;
    public ConcreteCommand(Receiver receiver){
        this.receiver = receiver;
    }
    @Override
    public void execute(String task) {
        //接收方來真正執行請求
        receiver.action(task);
    }
}
/**
 * 請求者角色類
 */
class Invoker {
    // 持有命令對象
    private Command command = null;
    public Invoker(Command command){
        this.command = command;
    }
    // 行動方法
    public void action(String task){
        command.execute(task);
    }
}
/**
 * 接收者角色類
 */
class Receiver {
    // 執行命令操作
    public void action(String task){
        System.out.println("執行命令:"+task);
    }
}

三、Spring框架應用

Spring框架中封裝的JdbcTemplate類API使用到了命令模式。

1、JdbcOperations介面

public interface JdbcOperations {
    @Nullable
    <T> T execute(StatementCallback<T> var1) ;
}

2、JdbcTemplate類

這裡只保留模式方法的代碼。

public class JdbcTemplate implements JdbcOperations {
    @Nullable
    public <T> T execute(StatementCallback<T> action) {
        try {
            T result = action.doInStatement(stmt);
        } catch (SQLException var9) {
        } finally {
        }
    }
}

3、StatementCallback介面

@FunctionalInterface
public interface StatementCallback<T> {
    @Nullable
    T doInStatement(Statement var1) ;
}

四、命令模式總結

  • 鬆散的耦合

命令模式使得命令發起者和命令執行者解耦,發起命令的對象完全不知道具體實現對象是誰。這和常見的MQ消息隊列原理是類似的。

  • 動態的控制

命令模式把請求封裝起來,可以動態地對它進行參數化、隊列化和等操作和管理,使系統更加的靈活。

  • 良好的擴展性

命令發起者和命令執行者實現完全解耦,因此擴展添加新命令很容易。

五、源代碼地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 場景 EasyCode是基於IntelliJ IDEA開發的代碼生成插件,支持自定義任意模板(Java,html,js,xml)。只要是與資料庫相關的代碼都可以通過自定義模板來生成。支持資料庫類型與java類型映射關係配置。支持同時生成生成多張表的代碼。每張表有獨立的配置信息。完全的個性化定義,規則 ...
  • 創建main.py文件並粘貼下麵代碼 點擊右鍵運行Debug 'main'後,下方的Debug視窗會出現ImportError: No module named 'bottle'這樣的提示,提示導入bottle包出錯 所以我們需要先安裝這兩個包,cmd,輸入pip install bottle 回車 ...
  • 方法1:自定義異常 方法2:將迴圈封裝為函數,return 方法3:用for...else...語句 方法3解釋: (1)break能跳出某一重迴圈(該重迴圈的本次及剩餘次數都不再執行),但並不能跳出該重迴圈的其他外重迴圈。 例如,最內第3重迴圈break之後,程式返回第2重迴圈繼續執行第2重的下一 ...
  • 一、預設參數 python為了簡化函數的調用,提供了預設參數機制: 這樣在調用pow函數時,就可以省略最後一個參數不寫: 在定義有預設參數的函數時,需要註意以下: 必選參數必須在前面,預設參數在後; 設置何種參數為預設參數?一般來說,將參數值變化小的設置為預設參數。 python標準庫實踐 pyth ...
  • 對於面向對象編程而言,命名空間namespace和use的概念非常重要. 1.根命名空間是反斜線 \ ,有點類似linux中的根目錄 / 的那種感覺,但使用var_dump()函數列印時其實是空字元串 1 var_dump(lxx_namespace); 2 //string(0) "" 2.而對於 ...
  • 1. php簡化版的圖片上傳(沒有各種驗證) 1 2 3 4 <form action="" enctype="multipart/form-data" method="post" > 請選擇需要上傳的文件:<input type="file" name="upfile" /><br> <input ...
  • 一.第一種情況(死迴圈) 二.第二種情況(類似while 條件) 五.break 與continue 和 ,break停止迴圈,continue跳出本層迴圈 ...
  • 利用sorted(iterable[, key][, reverse]) key:指定一個接收一個參數的函數,這個函數用於從每個元素中提取一個用於比較的關鍵字,預設值為None(直接比較元素) reverse:排序規則,reverse = True 降序 , reverse = False 升序(默 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...