根據您的命令-命令設計模式

命令設計模式是一種廣為人知的設計模式,它屬于行為設計模式(“四人幫”的一部分)。 顧名思義,它與應用程序中的動作和事件有關。
問題陳述:

假設有一個網頁將在其中包含多個菜單的情況。 編寫此代碼的一種方法是使條件成立,并在每次單擊菜單時執行操作。

private void getAction(String action){if(action.equalsIgnoreCase('New')){//Create new file}else if(action.equalsIgnoreCase('Open')){//Open existing file}if(action.equalsIgnoreCase('Print')){//Print the file}if(action.equalsIgnoreCase('Exit')){//get out of the application}}

我們必須根據操作字符串執行操作。 但是,以上代碼如果條件太多,則無法擴展。

意圖:

  • 動作的請求者需要與執行該動作的對象分離。
  • 允許將請求封裝為對象。 注意這一行,因為這對于命令模式是非常重要的概念。
  • 允許將請求存儲在隊列中,即允許您存儲稍后可以執行的操作列表。


解:

為了解決上述問題,這里可以使用命令模式。 如上所述,命令模式通過封裝將上述動作移至對象。 這些對象在執行時將執行命令。 在這里,每個命令都是一個對象。 因此,我們將必須為每個菜單操作(例如NewClassOpenClassPrintClassExitClass)創建單獨的類。 所有這些類都繼承自父接口(即Command接口)。 此接口(命令接口)抽象/包裝所有子動作類。
現在,我們介??紹一個Invoker類,其主要工作是將操作與具有該操作的類進行映射。 它基本上保留了該動作,并通過調用execute()方法獲得執行請求的命令。 糟糕! 我們在這里錯過了另一個利益相關者。 這是Receiver類。 接收器類具有執行操作的知識。 接收者具有執行動作時該做什么的知識。

結構體:

以下是“命令設計”模式的參與者:

  • 命令–這是用于執行操作的界面。
  • ConcreteCommand –此類擴展了Command接口并實現了execute方法。 此類在操作和接收者之間創建綁定。
  • 客戶端–此類創建ConcreteCommand類并將其與接收者相關聯。
  • 調用程序–此類要求命令執行請求。
  • 接收器–此類知道要執行的操作。


范例


腳步:

  1. 使用諸如execute()之類的方法簽名定義Command接口。 在上面的示例中, ActionListenerCommand是具有單個execute()方法的命令界面。
  2. 創建一個或多個派生類,這些派生類封裝以下內容的一些子集:“接收者”對象,要調用的方法,要傳遞的參數。 在上面的示例中, ActionOpenActionSave是Concrete命令類,它們在接收者和操作之間創建綁定。 ActionOpen類在execute()內調用接收方(在本例中為Document類)類的action方法。 因此,命令接收器類需要做什么。
  3. 為每個延遲的執行請求實例化Command對象。
  4. 將Command對象從創建者傳遞到調用者。
  5. 調用者決定何時執行()。
  6. 客戶端實例化Receiver對象(Document)和Command對象,并允許調用者調用命令。


代碼示例:

命令界面:

public interface ActionListenerCommand {public void execute();
}

接收器類別:

public class Document {public void Open(){System.out.println('Document Opened');}public void Save(){System.out.println('Document Saved');}
}

具體命令:

public class ActionOpen implements ActionListenerCommand {private Document adoc;public ActionOpen(Document doc) {this.adoc = doc;}@Overridepublic void execute() {adoc.Open();}
}

祈求者等級:

public class MenuOptions {private ActionListenerCommand openCommand;private ActionListenerCommand saveCommand;public MenuOptions(ActionListenerCommand open, ActionListenerCommand save) {this.openCommand = open;this.saveCommand = save;}
public void clickOpen(){openCommand.execute();
}
public void clickSave(){saveCommand.execute();
}
}

客戶類別

public class Client {public static void main(String[] args) {Document doc = new Document();ActionListenerCommand clickOpen = new ActionOpen(doc);ActionListenerCommand clickSave = new ActionSave(doc);MenuOptions menu = new MenuOptions(clickOpen, clickSave);menu.clickOpen();menu.clickSave();}}


優點:

命令模式有助于解耦調用方和接收方。 接收者是知道如何執行動作的人。
命令應能夠執行撤消和重做操作。
這種模式在可擴展性方面有所幫助,因為我們可以在不更改現有代碼的情況下添加新命令。

退稅:

命令模式的主要缺點是每個單獨命令的類數增加。 這些項目也可以通過方法實現來完成。 但是,命令模式類比使用if else條件創建多個方法更具可讀性。

有趣的一點:

  • java.lang.Runnable和javax.swing.Action的實現遵循命令設計模式。
  • 命令可以使用Memento來維護撤消操作所需的狀態。


下載示例代碼:

Download Sample Code

參考:來自您的JCG合作伙伴 Mainak Goswami的命令 ,位于Idiotechie博客上。

翻譯自: https://www.javacodegeeks.com/2012/11/by-your-command-command-design-pattern.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371110.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371110.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371110.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用js和jQuery做輪播圖

Javascript或jQuery做輪播圖 css樣式 <style> a{ text-decoration:none; } .naver{ width: 100%; position:relative; }.images{position:relative;width: 100%;height: 400px; } .images img{position:absolute;left: 0;top: 0;width: 100%;height: 400px;opacity: 0;fi…

w3school前端教程合集

有關前端開發的w3c教程合集。 http://caibaojian.com/w3school/ 地圖ajax教程Canvas教程CSS教程CSS3教程CSS3選擇器CSS參考手冊DHTML教程HTML教程HTML5教程HTML5音頻教程HTML DOM教程JavaScript教程jQuery教程jQuery Ajax教程jQuery事件jQuery操作jQuery選擇器jQuery遍歷json教…

【開發調試】谷歌瀏覽器中調試移動網頁和測試網速下頁面效果

、 今天有幸給大家分享一下谷歌瀏覽器針對移動網頁測試的技巧&#xff0c;主要是最近做個微信公共號網站。所以就要對頁面測試拉。移動網頁我們最長測得就是各種手機大小的頁面效果和出現網絡問題的效果展示。 今天就簡單分享下在谷歌瀏覽器測試頁面的適配和網速限制展示。…

拼多多分享好友砍價Java實現_拼多多砍價怎么分享到朋友圈 砍價發到微信朋友圈方法...

拼多多是一款電商社交的共享式購物平臺&#xff0c;現在還推出了砍價的活動&#xff0c;只要邀請好友砍價&#xff0c;你就以最低的價格購買商品&#xff0c;還可以可能是免費拿到&#xff0c;那么今天小編就給大家講講如何將自己的砍價信息分享到微信朋友圈。首先下載手機拼多…

通過6個簡單的步驟在Windows上運行Apache Hive

注意 &#xff1a;您需要安裝cygwin才能運行本教程&#xff0c;因為Hadoop&#xff08;Hive需要&#xff09;需要cygwin才能在Windows上運行。 至少&#xff0c;系統中必須存在Basic&#xff0c;Net&#xff08;OpenSSH&#xff0c;tcp_wrapper軟件包&#xff09;和與安全相關的…

vim編輯器初級(八)

:abbreviate  后面接一個縮寫&#xff0c;再接這個縮寫的全寫&#xff0c;這樣在輸入這個縮寫后&#xff0c;vim會自動將其展開為它的全寫 :abbreviate  列出目前你所設置的所有縮寫 :map  后面接一個字符串&#xff0c;再接這個字符串所映射的一串命令&#xff0c;這樣在…

java多文件post請求_如何使用Java發出多部分/表單數據POST請求?

我們使用HttpClient 4.x創建多部分文件post。更新&#xff1a;截至HttpClient 4.3&#xff0c;一些類已被棄用。下面是新API的代碼&#xff1a;CloseableHttpClient httpClient HttpClients.createDefault();HttpPost uploadFile new HttpPost("...");MultipartEnt…

vue 環境的搭建及初始化項目

其實超級簡單&#xff0c;雖然網上很多&#xff0c;但是我順便記錄下相當于做筆記吧 1nodejs 的安裝&#xff0c; 在node官網下載&#xff0c;點擊安裝&#xff0c;安裝的時候最好選擇路徑在d盤 2設置環境變量 我的電腦-->屬性-->系統環境變量- 系統變量新增一個NODE…

Java堆轉儲:您可以完成任務嗎?

如果您像我一樣對Java性能充滿熱情&#xff0c;那么堆轉儲分析對您來說應該不是一個謎。 如果是這樣&#xff0c;那么好消息是您將有機會提高您的Java故障診斷技能和JVM知識。 JVM現已發展到今天&#xff0c;與舊的JDK 1.0 – JDK 1.4天相比&#xff0c;今天生成和分析JVM堆轉…

MariaDB配置、集群

MariaDB在centos 7.3的安裝&#xff0c;配置和集群搭配 阿里云最新選配系統中&#xff0c;只有centos7.3可選&#xff0c;因此&#xff0c;基于centos 7的MariaDB的安裝&#xff0c;配置。。。 全部刪除MySQL/MariaDB MySQL 已經不再包含在 CentOS 7 的源中&#xff0c;而改用了…

java 調用 ictclas50_1-Ictclas50分詞系統ForJava

Ictclas50是一個分詞庫&#xff0c;我嘛主要用來做中文分詞&#xff0c;其也能分出詞性等東西。1.環境搭建進入到下載頁面進行下載&#xff1a;如下圖&#xff1a; 因為我的系統是64位的windows&#xff0c;所以選擇了到數第三行進行下載。其JAVA版本是通過JNI去調用dll庫&…

SpringMVC亂碼或前臺亂碼解決辦法

JSP頁面亂碼 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> 以及 form表單提交方式為必須為post 修改web.xml&#xff0c;增加編碼過濾器&#xff0c;如下&#xff08;注意&#xff0c;需要設置forceEncoding參數值…

Beam概念學習系列之Pipeline Runners

不多說&#xff0c;直接上干貨&#xff01; https://beam.apache.org/get-started/beam-overview/ 在 Beam 管道上運行引擎會根據你選擇的分布式處理引擎&#xff0c;其中兼容的 API 轉換你的 Beam 程序應用&#xff0c;讓你的 Beam 應用程序可以有效的運行在指定的分布式處理引…

使普通的舊Java OSGi兼容

盡管OSGi在Java世界中越來越流行&#xff0c;但仍有許多Java應用程序和庫尚未設計成可在OSGi中使用。 有時您可能需要在OSGi環境中運行這樣的代碼&#xff0c;或者是因為您想利用OSGi本身提供的好處&#xff0c;或者因為您需要僅由該特定環境提供的某些功能。 通常&#xff0c;…

運行 java classnotfound_JAR運行出現ClassNotFoundException異常的解決辦法

2009年10月30日最近在弄個聊天室,由于要跟數據庫通信,用到了JDBC的3個jar,在eclipse里OK的,但布置到服務器壞事了,不知道怎么弄JDBC的3個jar了寫個autoStart.batjava -jar chatServer.jarpause運行報錯:F:\mydocuments\java project\socketTest\release>java -jar chatServe…

idea 創建多模塊依賴Maven項目

轉載地址&#xff1a; http://www.cnblogs.com/tibit/p/6185704.html idea 創建多模塊依賴Maven項目 本來網上的教程還算多&#xff0c;但是本著自己有的才是自己的原則&#xff0c;還是自己寫一份的好&#xff0c;雖然可能自己也不會真的用得著。 1. 創建一個新maven項目 2.…

移動端適配問題

適配問題 怎么適配iphone6 1px問題 為什么頁面與設計稿會出現偏差&#xff1f; dpr設備像素/ css像素&#xff0c;只有dpr等于1的時候&#xff0c;實際效果和設計稿的尺寸比例才是1:1。因為iPhone6的DPR&#xff08;設備像素比&#xff09;為2&#xff0c;設備像素為750&…

用Java彈出創建新的消息通知

首先創建JFrame作為彈出窗口。 在其中添加一些JLabel以包含信息&#xff0c;并在適當的位置分配它們&#xff0c;使其看起來像一條通知消息。 下面給出了示例代碼&#xff1a; String message You got a new notification message. Isnt it awesome to have such a notificat…

mysql游標表間數據遷移_FalseMySQL存儲過程--gt;通過游標遍歷和異常處理遷移數據到歷史表-mysql-第二電腦網...

-- 大表數據遷移,每天凌晨1點到5點執行,執行間隔時間10分鐘&#xff0c;遷移舊數據到歷史表。DELIMITER $$USE dbx$$電腦技術網對《FalseMySQL存儲過程-->通過游標遍歷和異常處理遷移數據到歷史表》總結來說&#xff0c;為我們程序員很實用。DROP PROCEDURE IF EXISTS pro_x…

課后作業-閱讀任務-閱讀筆記-2

好的單元測試的標準&#xff1a; 1>單元測試應該在最基本的功能/參數上驗證程序的正確性 2>單元測試必須由最熟悉代碼的人&#xff08;程序的作者&#xff09;來寫 3>單元測試后&#xff0c;機器狀態保持不變 4>單元測試要快&#xff08;一個測試的運行時間是幾秒鐘…