摘要:命令設計模式涉及三類對象抽象命令類抽象命令類一般是一個抽象類或接口,在其中聲明了用于執行請求的等方法,通過這些方法可以調用請求接收者的相關操作。
命令模式
命令模式定義為:Encapsulate a request as an object,there by letting you parameterize clients with different requests,queue or log requests,and support undoable operations.使用場景命令模式是一個高內聚的模式,將一個請求封裝成一個對象,從而讓你使用不同的請求把客戶端參數化,對請 求排隊或者記錄請求日志,可以提供命令的撤銷和恢復功能.
在軟件開發中,我們經常需要向某些對象發送請求(調用其中的某個或某些方法),但是并不知道請求的接收者是誰,也不知道被請求的操作是哪個,此時,我們特別希望能夠以一種松耦合的方式來設計軟件,使得請求發送者與請求接收者能夠消除彼此之間的耦合,讓對象之間的調用關系更加靈活,可以靈活地指定請求接收者以及被請求的操作。命令模式為此類問題提供了一個較為完美的解決方案。命令模式可以將請求發送者和接收者完全解耦,發送者與接收者之間沒有直接引用關系,發送請求的對象只需要知道如何發送請求,而不必知道如何完成請求。
系統需要將請求調用者和請求接收者解耦,使得調用者和接收者不直接交互。請求調用者無須知道接收者的存在,也無須知道接收者是誰,接收者也無須關心何時被調用。
系統需要在不同的時間指定請求和執行請求。一個命令對象和請求的初始調用者可以有不同的生命期,換言之,最初的請求發出者可能已經不在了,而命令對象本身仍然是活動的,可以通過該命令對象去調用請求接收者,而無須關心請求調用者的存在性,可以通過請求日志文件等機制來具體實現。
系統需要支持命令的撤銷(Undo)操作和恢復(Redo)操作。
系統需要將一組操作組合在一起形成宏命令。
命令設計模式涉及三類對象Command(抽象命令類)
抽象命令類一般是一個抽象類或接口,在其中聲明了用于執行請求的execute()等方法,通過這些方法可以調用請求接收者的相關操作。
ConcreteCommand(具體命令類)
具體命令類是抽象命令類的子類,實現了在抽象命令類中聲明的方法,它對應具體的接收者對象,將接收者對象的動作綁定其中。在實現execute()方法時,將調用接收者對象的相關操作(Action)。
Invoker(調用者)--也可以有接口類
調用者即請求發送者,它通過命令對象來執行請求。一個調用者并不需要在設計時確定其接收者,因此它只與抽象命令類之間存在關聯關系。在程序運行時可以將一個具體命令對象注入其中,再調用具體命令對象的execute()方法,從而實現間接調用請求接收者的相關操作。
Receiver(接收者)
接收者執行與請求相關的操作,它具體實現對請求的業務處理。
Command(抽象命令類)
// 命令模式 let ICommend = new Interface("ICommend", ["execute","undo"])
ConcreteCommand(具體命令類)
let LightOnCommand = function (light) { this.light = light; }; LightOnCommand.prototype.execute = function () { light.on(); }; LightOnCommand.prototype.undo = function () { light.off(); }; let TVOnCommand = function (tv) { this.tv = tv; }; TvOnCommand.prototype.execute = function () { tv.on(); }; TvOnCommand.prototype.undo = function () { tv.off(); };
Invoker(調用者)
let IPhone = function () { this.commands = []; }; IPhone.prototype.setCommand = function (command) { this.commands.push(command); }; IPhone.prototype.onButtonWasPushed = function (slot) { this.commands[slot-1].execute(); };
Receiver(接收者)
let IHouseApplication = new Interface("IHouseApplication", ["on","off"]);
Receiver(接收者)--也可以有接口類
let TV = function () { }; TV.prototype.on = function() { System.out.println("the TV on"); }; TV.prototype.off = function() { System.out.println("the TV off"); }; let Light = function () { }; Light.prototype.on = function() { System.out.println("the Light on"); }; Light.prototype.off = function() { System.out.println("the Light off"); };調用
let miPhone = new IPhone(); //創建電器 let light = new Light(); let tv = new TV(); //創建命令 let lightOnCommand = new LightOnCommand(light); let tvOnCommand = new TVOnCommand(tv); //給手機設置命令 //設置第一個按鈕為開燈 miPhone.setCommand(lightOnCommand); //設置第二個按鈕為開電視 miPhone.setCommand(tvOnCommand); //開燈 miPhone.onButtonWasPushed(1); //開電視 miPhone.onButtonWasPushed(2);
優點
類間解耦:調用者角色與接收者角色之間沒有任何依賴關系,調用者實現功能時只需調用Command 抽象類的execute方法就可以,不需要了解到底是哪個接收者執行。
可擴展性:Command的子類可以非常容易地擴展,而調用者Invoker和高層次的模塊Client不產生嚴 重的代碼耦合。
命令模式結合其他模式會更優秀:命令模式可以結合責任鏈模式,實現命令族解析任務;結合模板方法模式,則可以減少 Command子類的膨脹問題。
缺點
命令模式也是有缺點的,請看Command的子類:如果有N個命令,問題就出來 了,Command的子類就可不是幾個,而是N個,這個類膨脹得非常大,這個就需要讀者在項 目中慎重考慮使用。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92874.html
摘要:中的命令模式點擊按鈕刷新菜單目錄設置背景色的例子撤銷命令我們現在來實現一個撤銷操作的例子界面上有四個按鈕,三個可以設置不同的背景色,按鈕可以撤銷上一次的操作重做操作這里我們增加一個按鈕,以恢復之前的操作,需要一個來記錄當前的索引 前言 本系列文章主要根據《JavaScript設計模式與開發實踐》整理而來,其中會加入了一些自己的思考。希望對大家有所幫助。 文章系列 js設計模式--單例模...
摘要:撤銷重做是一款編輯器的基礎功能,它讓用戶在進行錯誤操作后,可以讓編輯器回滾到錯誤操作前的狀態。選擇實現方案基于對象序列化的實現功能,其中一個方法是基于對象序列化的。示例編輯器的撤銷重做功能使用了這種模式。 最近在做一個網頁版的 svg 編輯器,為此學習了編輯器相關方面的知識。本文是我的一些粗淺學習總結,希望可以給初學者一些思路。 前面的話 隨著近幾年前端技術的快速發展,人們更傾向于將應...
摘要:大部分前端應用都部署在上,若想全局住一個項目,命令是一項必不可少的技能。編輯器命令非常強大,掌握最最基本的就可以解決問題了。命令模式下接受命令輸入且顯示在終端,回車生效。常見的命令有,退出,強制退出,保存,保存并退出。 大部分前端應用都部署在linux上,若想全局hold住一個項目,linux命令是一項必不可少的技能。許多前端對linux命令并不重視,其實這是一個學習性價比非常高的知識...
摘要:自阮大神的文章發布以來,有了一些改動,添加有很多有用的功能,特別是這個功能,對打造命令行工具集合非常有用,所以寫一個新版本的教程還是有必要的。 前言 使用命令行程序對程序員來說很常見,就算是前端工程師或者開發gui的,也需要使用命令行來編譯程序或者打包程序 熟練使用命令行工具能極大的提高開發效率,linux自帶的命令行工具都非常的有用,但是這些工具都是按照通用需求開發出來的,如果有一些...
閱讀 1772·2023-04-25 21:50
閱讀 2419·2019-08-30 15:53
閱讀 768·2019-08-30 13:19
閱讀 2743·2019-08-28 17:58
閱讀 2465·2019-08-23 16:21
閱讀 2701·2019-08-23 14:08
閱讀 1374·2019-08-23 11:32
閱讀 1439·2019-08-22 16:09