国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

掌握設(shè)計(jì)模式:深入了解命令模式的優(yōu)雅調(diào)度與行為解耦

這篇具有很好參考價值的文章主要介紹了掌握設(shè)計(jì)模式:深入了解命令模式的優(yōu)雅調(diào)度與行為解耦。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

命令模式是一種行為設(shè)計(jì)模式,其目的是將請求發(fā)送者和接收者解耦,從而允許發(fā)送者發(fā)送請求,而無需知道請求的具體處理方式。在命令模式中,請求被封裝為一個對象,這個對象包含了執(zhí)行請求所需的所有信息,包括調(diào)用方法、參數(shù)等。這樣,請求的發(fā)送者只需知道如何發(fā)送命令對象,而不需要關(guān)心命令的具體執(zhí)行。

關(guān)鍵角色和概念:

命令接口(Command): 聲明了執(zhí)行命令的方法 execute(),以及可能的撤銷方法 undo() 和重做方法 redo()。這個接口可以有多個具體實(shí)現(xiàn)類,每個類代表不同的命令。
具體命令(ConcreteCommand): 實(shí)現(xiàn)了命令接口,負(fù)責(zé)執(zhí)行具體的操作。它通常包含一個接收者對象,通過調(diào)用接收者的方法來完成實(shí)際的工作。
調(diào)用者(Invoker): 請求的發(fā)送者,負(fù)責(zé)將命令發(fā)送給接收者。它并不知道命令的具體執(zhí)行細(xì)節(jié),只是負(fù)責(zé)發(fā)送請求。
接收者(Receiver): 實(shí)際執(zhí)行命令操作的對象。命令對象通常會包含一個接收者,通過調(diào)用接收者的方法來完成命令的執(zhí)行。
客戶端(Client): 創(chuàng)建命令對象、接收者對象以及調(diào)用者對象的地方。客戶端將命令對象與調(diào)用者關(guān)聯(lián),并發(fā)送請求。

命令模式的優(yōu)點(diǎn)包括:

解耦請求發(fā)送者和接收者: 命令模式將請求的發(fā)送者和接收者解耦,使得它們不需要直接了解對方。這提高了系統(tǒng)的靈活性和可維護(hù)性。

支持撤銷和重做: 通過在命令對象中添加 undo() 和 redo() 方法,可以輕松實(shí)現(xiàn)撤銷和重做操作。

容易擴(kuò)展: 可以輕松添加新的命令類,無需修改現(xiàn)有的代碼。

命令模式通常在需要對請求進(jìn)行參數(shù)化、排隊(duì)、記錄日志、支持撤銷和重做等場景中發(fā)揮作用。

簡易命令模式示例:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Command Pattern Demo</title>
  </head>
  <body>
    <!-- 頁面標(biāo)題 -->
    <h1>Command Pattern Demo</h1>

    <!-- 按鈕觸發(fā)燈的開關(guān)命令 -->
    <button onclick="pressLightButton()">Toggle Light</button>
    <!-- 按鈕觸發(fā)風(fēng)扇的開關(guān)命令 -->
    <button onclick="pressFanButton()">Toggle Fan</button>
    <!-- 按鈕觸發(fā)撤銷操作 -->
    <button onclick="undo()">Undo</button>
    <!-- 按鈕觸發(fā)重做操作 -->
    <button onclick="redo()">Redo</button>

    <!-- 圖片顯示燈和風(fēng)扇狀態(tài) -->
    <div>
      <img
        id="light"
        src="./light.png"
        height="90"
        style="filter: grayscale(100%)"
      />
      <img
        id="fan"
        src="./fan.png"
        height="90"
        style="filter: grayscale(100%)"
      />
    </div>

    <!-- 顯示命令執(zhí)行信息的區(qū)域 -->
    <div id="output"></div>

    <script>
      // 命令接口
      class Command {
        execute() {}
        undo() {}
        redo() {}
      }

      // 具體命令 - 打開燈
      class LightOnCommand extends Command {
        constructor(light) {
          super();
          this.light = light;
        }

        execute() {
          this.light.turnOn();
          addCommandToHistory(this);
        }

        undo() {
          this.light.turnOff();
        }

        redo() {
          this.light.turnOn();
        }
      }

      // 具體命令 - 關(guān)閉燈
      class LightOffCommand extends Command {
        constructor(light) {
          super();
          this.light = light;
        }

        execute() {
          this.light.turnOff();
          addCommandToHistory(this);
        }

        undo() {
          this.light.turnOn();
        }

        redo() {
          this.light.turnOff();
        }
      }

      // 具體命令 - 打開風(fēng)扇
      class FanOnCommand extends Command {
        constructor(fan) {
          super();
          this.fan = fan;
        }

        execute() {
          this.fan.turnOn();
          addCommandToHistory(this);
        }

        undo() {
          this.fan.turnOff();
        }

        redo() {
          this.fan.turnOn();
        }
      }

      // 具體命令 - 關(guān)閉風(fēng)扇
      class FanOffCommand extends Command {
        constructor(fan) {
          super();
          this.fan = fan;
        }

        execute() {
          this.fan.turnOff();
          addCommandToHistory(this);
        }

        undo() {
          this.fan.turnOn();
        }

        redo() {
          this.fan.turnOff();
        }
      }

      // 接收者 - 燈
      class Light {
        constructor() {
          this.isOn = false;
        }

        turnOn() {
          this.isOn = true;
          // 獲取燈的 DOM 元素并設(shè)置為彩色(非灰度)
          const dom = document.getElementById("light");
          dom.style.filter = "grayscale(0%)";
          // 更新信息
          updateOutput("燈被打開了");
        }

        turnOff() {
          this.isOn = false;
          // 獲取燈的 DOM 元素并設(shè)置為灰度
          const dom = document.getElementById("light");
          dom.style.filter = "grayscale(100%)";
          // 更新信息
          updateOutput("燈被關(guān)閉了");
        }
      }

      // 接收者 - 風(fēng)扇
      class Fan {
        constructor() {
          this.isOn = false;
        }

        turnOn() {
          this.isOn = true;
          // 獲取風(fēng)扇的 DOM 元素并設(shè)置為彩色(非灰度)
          const dom = document.getElementById("fan");
          dom.style.filter = "grayscale(0%)";
          // 更新信息
          updateOutput("風(fēng)扇被打開了");
        }

        turnOff() {
          this.isOn = false;
          // 獲取風(fēng)扇的 DOM 元素并設(shè)置為灰度
          const dom = document.getElementById("fan");
          dom.style.filter = "grayscale(100%)";
          // 更新信息
          updateOutput("風(fēng)扇被關(guān)閉了");
        }
      }

      // 創(chuàng)建燈和風(fēng)扇的實(shí)例
      const light = new Light();
      const fan = new Fan();

      // 創(chuàng)建具體命令實(shí)例
      const lightOnCommand = new LightOnCommand(light);
      const lightOffCommand = new LightOffCommand(light);
      const fanOnCommand = new FanOnCommand(fan);
      const fanOffCommand = new FanOffCommand(fan);

      // 命令歷史記錄和索引
      let commandHistory = [];
      let historyIndex = -1;

      // 將命令添加到歷史記錄
      function addCommandToHistory(command) {
        if (commandHistory.length >= 100) commandHistory.shift();
        commandHistory.push(command);
        historyIndex = commandHistory.length - 1;
      }

      // 撤銷操作
      function undo() {
        if (historyIndex >= 0) {
          // 執(zhí)行當(dāng)前索引對應(yīng)的命令的撤銷操作
          commandHistory[historyIndex].undo();
          historyIndex--;
        }
      }

      // 重做操作
      function redo() {
        if (historyIndex < commandHistory.length - 1) {
          // 增加歷史索引并執(zhí)行對應(yīng)命令的操作
          historyIndex++;
          commandHistory[historyIndex].redo();
        }
      }

      // 按鈕點(diǎn)擊觸發(fā)燈的開關(guān)命令
      function pressLightButton() {
        if (light.isOn) {
          lightOffCommand.execute();
        } else {
          lightOnCommand.execute();
        }
      }

      // 按鈕點(diǎn)擊觸發(fā)風(fēng)扇的開關(guān)命令
      function pressFanButton() {
        if (fan.isOn) {
          fanOffCommand.execute();
        } else {
          fanOnCommand.execute();
        }
      }

      // 更新頁面上顯示命令執(zhí)行信息的區(qū)域
      function updateOutput(message) {
        const outputDiv = document.getElementById("output");
        outputDiv.innerHTML = `<p>${message}</p>`;
      }
    </script>
  </body>
</html>

運(yùn)行演示:

掌握設(shè)計(jì)模式:深入了解命令模式的優(yōu)雅調(diào)度與行為解耦,設(shè)計(jì)模式,命令模式文章來源地址http://www.zghlxwxcb.cn/news/detail-822803.html

到了這里,關(guān)于掌握設(shè)計(jì)模式:深入了解命令模式的優(yōu)雅調(diào)度與行為解耦的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 設(shè)計(jì)模式之開閉原則:如何優(yōu)雅地?cái)U(kuò)展軟件系統(tǒng)

    設(shè)計(jì)模式之開閉原則:如何優(yōu)雅地?cái)U(kuò)展軟件系統(tǒng)

    在現(xiàn)代軟件開發(fā)中,設(shè)計(jì)模式是解決常見問題的最佳實(shí)踐。其中,開閉原則作為面向?qū)ο笤O(shè)計(jì)的六大基本原則之一,為軟件系統(tǒng)的可維護(hù)性和擴(kuò)展性提供了強(qiáng)大的支持。本文將深入探討開閉原則的核心理念,以及如何在實(shí)際項(xiàng)目中運(yùn)用這一原則,以便更好地設(shè)計(jì)軟件系統(tǒng)。

    2024年01月18日
    瀏覽(23)
  • 一文掌握設(shè)計(jì)模式(定義+UML類圖+應(yīng)用)

    一文掌握設(shè)計(jì)模式(定義+UML類圖+應(yīng)用)

    從學(xué)編程一開始就被告知,要想做一名優(yōu)秀的程序員兩大必要技能: 1.源碼閱讀(JDK、C等底層語言封裝) 2.設(shè)計(jì)模式(使用某種語言優(yōu)雅的落地典型場景功能)。 一般隨著工作年限的增長,被迫對底層語言/框架源碼閱讀的越來愈多,但是設(shè)計(jì)模式如不刻意去學(xué)習(xí),永遠(yuǎn)不會真正掌

    2024年02月11日
    瀏覽(30)
  • 【chatgpt】讓gpt帶你掌握設(shè)計(jì)模式

    讓gpt帶你掌握設(shè)計(jì)模式 準(zhǔn)備設(shè)計(jì)模式面試的 概述 什么是設(shè)計(jì)模式? 為什么設(shè)計(jì)模式重要? 設(shè)計(jì)模式的分類 創(chuàng)建型模式 (Creational Patterns) 單例模式 (Singleton Pattern) 工廠模式 (Factory Pattern) 抽象工廠模式 (Abstract Factory Pattern) 建造者模式 (Builder Pattern) 原型模式 (Prototype Pattern) 結(jié)

    2024年02月05日
    瀏覽(19)
  • AI問答:前端需要掌握的設(shè)計(jì)模式/vue項(xiàng)目使用了哪些設(shè)計(jì)模式/vue項(xiàng)目開發(fā)可以使用哪些設(shè)計(jì)模式

    AI問答:前端需要掌握的設(shè)計(jì)模式/vue項(xiàng)目使用了哪些設(shè)計(jì)模式/vue項(xiàng)目開發(fā)可以使用哪些設(shè)計(jì)模式

    一、理解什么是設(shè)計(jì)模式 設(shè)計(jì)模式是對軟件設(shè)計(jì)開發(fā)過程中反復(fù)出現(xiàn)的某類問題的通用解決方案。 設(shè)計(jì)模式是一個在軟件設(shè)計(jì)領(lǐng)域中被廣泛應(yīng)用的概念,它指的是一套被公認(rèn)為有效的解決特定問題的設(shè)計(jì)思路和方法。 設(shè)計(jì)模式更多的是指導(dǎo)思想和方法論,而不是現(xiàn)成的代碼

    2024年02月09日
    瀏覽(25)
  • 【深入理解設(shè)計(jì)模式】 工廠設(shè)計(jì)模式

    【深入理解設(shè)計(jì)模式】 工廠設(shè)計(jì)模式

    工廠設(shè)計(jì)模式是一種 創(chuàng)建型設(shè)計(jì)模式 ,它提供了一種在不指定具體類的情況下創(chuàng)建對象的接口。在工廠設(shè)計(jì)模式中,我們定義一個創(chuàng)建對象的接口,讓子類決定實(shí)例化哪一個類。工廠方法使一個類的實(shí)例化延遲到其子類。 工廠設(shè)計(jì)模式的目的是: 封裝對象創(chuàng)建的過程,使得

    2024年02月22日
    瀏覽(15)
  • 【了解一下常見的設(shè)計(jì)模式】

    【了解一下常見的設(shè)計(jì)模式】

    **設(shè)計(jì)模式(Design Pattern)**是軟件開發(fā)過程中一般問題的解決方案,是無數(shù)面向?qū)ο筌浖_發(fā)人員的經(jīng)驗(yàn)總結(jié),對于軟件設(shè)計(jì)開發(fā)十分重要。然而由于設(shè)計(jì)模式種類繁多,內(nèi)容偏理論,缺乏開發(fā)經(jīng)驗(yàn)對于相關(guān)概念的理解也比較困難,同時其中不乏很多類型相似的設(shè)計(jì)模式,更

    2024年02月12日
    瀏覽(21)
  • 深入理解設(shè)計(jì)模式:設(shè)計(jì)模式定義、設(shè)計(jì)原則以及組織編目

    軟件領(lǐng)域的設(shè)計(jì)模式起源主要是受到1977年建筑大師Alexander出版的《A Pattern Language:Towns, Building, Construction》一書。Alexander在其著作中將其建筑行業(yè)中的許多問題的最佳解決方案記錄為200多種模式,其思想不僅在建筑行業(yè)影響深遠(yuǎn),而且很快影響到了軟件設(shè)計(jì)領(lǐng)域。 1987年,K

    2024年02月14日
    瀏覽(19)
  • 【深入淺出設(shè)計(jì)模式--狀態(tài)模式】

    【深入淺出設(shè)計(jì)模式--狀態(tài)模式】

    狀態(tài)模式是一種行為設(shè)計(jì)模式,讓你能在一個對象的內(nèi)部狀態(tài)變化時改變其行為,使其看上去就像改變了自身所屬的類一樣。其與有限狀態(tài)機(jī)的概念緊密相關(guān),如下所示: 在實(shí)際設(shè)計(jì)編碼UI界面的工作中,有很多人應(yīng)該都遇到過類似這樣的場景:當(dāng)鼠標(biāo)移動或者點(diǎn)擊某個標(biāo)簽

    2024年02月10日
    瀏覽(79)
  • 探索設(shè)計(jì)模式的魅力:“感受單例模式的力量與神秘” - 掌握編程的王牌技巧

    探索設(shè)計(jì)模式的魅力:“感受單例模式的力量與神秘” - 掌握編程的王牌技巧

    ? ? ? 在軟件開發(fā)的賽場上,單例模式以其獨(dú)特的魅力長期占據(jù)著重要的地位。作為設(shè)計(jì)模式中的一員,它在整個軟件工程的棋盤上扮演著關(guān)鍵性角色。本文將帶你深入探索單例模式的神秘面紗,從歷史淵源到現(xiàn)代應(yīng)用,從基礎(chǔ)實(shí)現(xiàn)到高級技巧,經(jīng)過戲劇性的轉(zhuǎn)折和層層推進(jìn)

    2024年01月20日
    瀏覽(22)
  • 深入淺出設(shè)計(jì)模式 - 裝飾者模式

    深入淺出設(shè)計(jì)模式 - 裝飾者模式

    博主介紹 : ?博主從事應(yīng)用安全和大數(shù)據(jù)領(lǐng)域,有8年研發(fā)經(jīng)驗(yàn),5年面試官經(jīng)驗(yàn),Java技術(shù)專家? Java知識圖譜點(diǎn)擊鏈接: 體系化學(xué)習(xí)Java(Java面試專題) ???? 感興趣的同學(xué)可以收藏關(guān)注下 , 不然下次找不到喲 ???? 裝飾者模式(Decorator Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,它

    2024年02月11日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包