1. 程式人生 > >設計模式之命令模式(三)

設計模式之命令模式(三)

我回來啦!今天是週六,一看命令模式還有一個總結未完成,趕緊爬起來做做好。

就如上一篇所說的,如果擁有了一個遙控器,卻無法光憑按下一個按你,就同時能弄暗燈光、開啟音響和電視、設定到DVD,並讓熱水器開始加溫,那麼我要這個遙控器還有什麼意義呢?

使用巨集命令

根據比較高階的想法來看,就是我們需要製造一種新的命令,用來執行其他一堆命令,而不只是執行一個命令,這樣就是一個不錯的想法了吧。這就是我們將要說的巨集命令。

public class MacroCommand implements Command {
    // 在巨集命令中,用命令陣列儲存一大堆命令
    Command[] commands;
 
    public MacroCommand(Command[] commands) {
        this.commands = commands;
    }
 
    public void execute() {
        for (int i = 0; i < commands.length; i++) {
        // 當這個巨集命令被遙控器執行時,就一次性執行數組裡的每個命令
            commands[i].execute();
        }
    }
 
    /**
     * NOTE:  these commands have to be done backwards to ensure 
     * proper undo functionality
     */
    public void undo() {
        for (int i = commands.length -1; i >= 0; i--) {
            commands[i].undo();
        }
    }
}

讓我們來看下如何使用巨集命令:

  1. 先建立想要進入巨集的命令集合
Light light = new Light("Living Room");
TV tv = new TV("Living Room");
Stereo stereo = new Stereo("Living Room");
Hottub hottub = new Hottub();
 
LightOnCommand lightOn = new LightOnCommand(light);
StereoOnCommand stereoOn = new StereoOnCommand(stereo);
TVOnCommand tvOn = new TVOnCommand(tv);
HottubOnCommand hottubOn = new HottubOnCommand(hottub);
  1. 接下來建立兩個陣列,其中一個用來記錄開啟命令,另一個用來記錄關閉命令,並在陣列內放入對應的命令
Command[] partyOn = { lightOn, stereoOn, tvOn, hottubOn};
Command[] partyOff = { lightOff, stereoOff, tvOff, hottubOff};
  
MacroCommand partyOnMacro = new MacroCommand(partyOn);
MacroCommand partyOffMacro = new MacroCommand(partyOff);
  1. 然後將巨集命令指定給我們所希望的按鈕:
remoteControl.setCommand(0, partyOnMacro, partyOffMacro);
  1. 最後,只需按下一些按鈕,測試是否正常工作
System.out.println(remoteControl);
System.out.println("--- Pushing Macro On---");
remoteControl.onButtonWasPushed(0);
System.out.println("--- Pushing Macro Off---");
remoteControl.offButtonWasPushed(0);

不會忘記我們的撤銷功能

public void undo() {
    for (int i = commands.length -1; i >= 0; i--) {
        commands[i].undo();
    }
}

命令模式的更多用途:佇列請求

命令可以將運算塊打包(一個接收者和一組動作),然後將它傳來傳去,就像是一般的物件一樣。現在,即使在命令被建立許久之後,運算依然可以被呼叫。事實上,它甚至可以在不同的執行緒中被呼叫。我們可以利用這樣的特性衍生一些應用,例如:日程安排、執行緒池、工作佇列等。

想象一個工作佇列:你再某一端新增命令,然後另一端則是執行緒。執行緒進行下面的動作:從佇列中取出一個命令,呼叫它的execute()方法,等待這個呼叫完成,然後將此命令物件丟棄,再取出下一個命令。。。

請注意,工作佇列類和進行計算的物件之間完全是解耦的。此刻執行緒可能在進行財務運算,下一刻卻在讀取網路資料。工作佇列物件不在乎到底做些什麼,他們只知道取出命令物件,然後呼叫其execute()方法。

命令模式的更多用途:日誌請求

某些應用需要我們將所有的動作都記錄在日誌中,並能在系統宕機之後,重新呼叫這些動作恢復到之前的狀態。命令模式能夠支援這一點。

當我們執行命令的時候,將歷史記錄儲存在磁碟中,一旦系統宕機,我們就可以將命令物件重新載入,併成批地依次呼叫這些物件的execute()方法。

比如有許多呼叫大型資料結構的應用無法在每次改變發生時被快速地儲存。通過使用記錄日誌,我們可以將上次檢查點之後的所有操作記錄下來,如果系統出狀況,從檢查點開始應用這些操作。比如說,對於電子表格應用,我們可能想要實現的錯誤回覆方式是將電子表格的操作記錄在日誌中,而不是每次電子表格一有變化就記錄整個電子表格。

對於更高階的應用而言,這些技巧可以被擴充套件應用到事務處理中,也就是說,一整群操作必須全部進行完成,或者沒有進行任何的操作。

設計箱內的工具

還是按照之前的套路,總結下工具箱內新增的工具吧

  • OO基礎

    抽象、封裝、繼承、多型

  • OO原則

    封裝變化

    多用組合,少用繼承

    針對介面程式設計,不針對實現程式設計

    為互動物件之間的鬆耦合設計而努力

    依賴抽象,不要依賴具體類

    類應該對擴充套件開放,對修改關閉

  • OO模式

    『策略模式』、『觀察者模式』、『裝飾者模式』、『抽象工廠模式』、『工廠方法模式』、『單例模式』

    『命令模式』將請求封裝成物件,這可以讓你使用不同的請求、佇列,或者日誌請求來引數化其他物件。命令模式也可以支援撤銷操作。

我們學習命令模式,就是一個循序漸進的過程,先從簡單的開關開始,然後再到複雜的開啟狀態,進而想到佇列,想到記錄日誌這種事務操作。學習也是一個循序漸進的過程,我們通過簡單的Demo學習,然後到專案實踐,再到後面獨立設計框架,我相信大家都能悟出這個道理來。

持續學習,精進學習,我們會一起加油。下一次,我們將學習介面卡模式與外觀模式

愛生活,愛學習,愛感悟,愛挨踢

相關推薦

設計模式命令模式

我回來啦!今天是週六,一看命令模式還有一個總結未完成,趕緊爬起來做做好。 就如上一篇所說的,如果擁有了一個遙控器,卻無法光憑按下一個按你,就同時能弄暗燈光、開啟音響和電視、設定到DVD,並讓熱水器開始加溫,那麼我要這個遙控器還有什麼意義呢? 使用巨集命令 根據比較高階的想法來看,就是我們需要製造一種新的命令,

設計模式命令模式Command Pattern

摘要 命令模式(Command Pattern)是一種資料驅動的設計模式,它屬於行為型模式。請求以命令的形式包裹在物件中,並傳給呼叫物件。呼叫 介紹 意圖:將一個請求封裝成一個物件,從而使您可以用不同的請求對客戶進行引數化。 主要解決:在軟體系統中,行為請求者與行為實現者通常是一種緊

C++:設計模式命令模式例子

// 設計模式測試.cpp : 定義控制檯應用程式的入口點。 // 命令模式 #include "stdafx.h" #include <string> #include <iost

設計模式命令模式

在本次學習過程中,我們把封裝帶到一個全新的境界:把方法呼叫(method invocation)封裝起來。沒錯,通過封裝方法呼叫,我們可以把運算塊包裝成形。 所以呼叫此運算的物件不需要關心事情是如何進行的,只要知道如何使用包裝成形的方法來完成它就可以。通過封裝方法呼叫,也可以做一些很聰明的事情,例如記錄日誌,

設計模式命令模式

上一次留給大家去做的實踐,不知道大家執行的怎麼樣了呢。 我們通過一個簡單的練習,完成了一個控制開關。那現在,我們打算將遙控器的每個插槽,對應到一個命令這樣就要遙控器變成“呼叫者”。當按下按鈕,相應命令物件的execute()方法就會被呼叫,其結果就是,接收者(例如電燈、風扇、音響)的動作被呼叫。 實現遙控器

設計模式問題集錦

是把 後繼 ogr data- 跟著 沒有 解釋器 space 基本實現 設計模式的主要資料是《大話設計模式》。第一階段先看看各種模式的基本概念。實現每一個模式下的樣例。然後在進行理解性的學習和掌握,靈活掌握各種模式的長處,知道某種模式適合那種狀態。如今,樣

《大話設計模式》——讀後感 8好菜每回味不同——建造者模式基礎案例1

ted builds src ret 分離 args 類圖 rec 方法 建造者模式:是將一個復雜的對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 建造者模式通常包括下面幾個角色: 1. builder:給出一個抽象接口,以規範產品對象的各個組成成分的

設計模式六大原則轉載

具體類 ima 傳遞參數 基礎上 比較 擁有 tex 至少 基類 關於設計模式的六大設計原則的資料網上很多,但是很多地方解釋地都太過於籠統化,我也找了很多資料來看,發現CSDN上有幾篇關於設計模式的六大原則講述的比較通俗易懂,因此轉載過來。   原作者博客鏈接:http:/

設計模式簡單小例子行為型模式

終於,把設計模式小例子敲完了..... 原始碼已經上傳到了GitHub. https://github.com/tanglonghui/DesignPatterns 設計模式簡單小例子(一) 建立型模式: https://blog.csdn.net/qq_40687864/artic

Java設計模式總體簡介——簡單易懂

設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。使用設計模式是為了可重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的,設計模式使程式碼編制真正工程化,設計模式是

設計模式——java版》

三、抽象工廠模式         1.為建立一組相關或相互依賴的物件提供一個介面,而且無須指定它們的具體類。抽象工廠模式是工廠方法模式的升級版本。在有多個業務品種、業務分類時,通過抽象工廠模式產生需要的物件是一種非常好的解決方式。   &

學習路-RabbitMQ:RabbitMQ的工作模式

RabbitMQ有以下幾種工作模式 : 1、Work queues 工作佇列 2、Publish/Subscribe 釋出訂閱模式 3、Routing 路由模式 4、Topics 萬用字元模式 5、Header 6、RPC 一:Work queues 工作佇列 work queues與

設計模式裝飾者Decorator模式

首先來看一個場景,如圖: 工人分為很多種類,比如電工,管道工等等,同時又有A公司的電工,B公司的電工,A公司的管道工,B公司的管道工等等,那麼當有M個工種和N個公司的時候,就會有 M * N 個子類,這個繼承體系就會變得很龐大和複雜。那麼如何簡化呢,那麼

Javascript設計模式簡單工廠

建立型設計模式-簡單工廠模式 簡單工廠模式(Simple Factory):又稱之為靜態工廠模式,由一個工廠物件建立某一種產品物件類的例項。主要用來建立同一類物件。 多類單例項法 為了加深我們的理解,設定以下需求。假設一個大型超市賣各種東西,

設計模式美學習:為何說要多用組合少用繼承?如何決定該用組合還是繼承?

在面向物件程式設計中,有一條非常經典的設計原則,那就是:組合優於繼承,多用組合少用繼承。為什麼不推薦使用繼承?組合相比繼承有哪些優勢?如何判斷該用組合還是繼承? 為什麼不推薦使用繼承? 繼承是面向物件的四大特性之一,用來表示類之間的 is-a 關係,可以解決程式碼複用的問題。雖然繼承有諸多作用,但繼承層次過深

設計模式美學習:業務開發常用的基於貧血模型的MVC架構違背OOP嗎?

我們都知道,很多業務系統都是基於 MVC 三層架構來開發的。實際上,更確切點講,這是一種基於貧血模型的 MVC 三層架構開發模式。 雖然這種開發模式已經成為標準的 Web 專案的開發模式,但它卻違反了面向物件程式設計風格,是一種徹徹底底的面向過程的程式設計風格,因此而被有些人稱為反模式(anti-patter

設計模式命令模式

能夠 ger 不同 exec cor del 需要 content ces 設計模式之命令模式 Feb 24, 2015 命令模式(Command)的定義是:用於將一個請求封裝成一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或者記錄請求日誌,以及執行可撤銷的

設計模式命令模式(Command)摘錄

single 而是 names 都得 結構 意圖 iterator nbsp 軟件 23種GOF設計模式一般分為三大類:創建型模式、結構型模式、行為模式。創建型模式抽象了實例化過程,它們幫助一個系統獨立於怎樣創建、組合和表示它的那些對象。一個類創建型模式使用繼承改變被實例

設計模式命令模式 Command

sta clas ide class open cli private 2017年 命令模式 介紹 角色 使用場景 代碼實現 public interface Command { //這個方法是一個返回結果為空的方法 //實際項目中,可

java設計模式命令模式

int aud 按鍵 設計 oid 定義 bsp class 命令 命令模式:   對命令的封裝,把發出命令的責任和執行命令的責任分割開,委派給不同的對象。 命令模式涉及到五個角色: 客戶端(CommandMain)角色:創建一個具體命令並確定接收者(觸發錄音機按