java命令模式_Java中的命令设计模式
java命令模式
在本教程中,我們將學習命令模式,這是一種重要的行為設計模式。 它具有一些重要的應用程序,例如在文本編輯器中實現撤消/重做功能。
在命令設計模式中,有一個命令對象位于發送方和接收方對象之間。 發送者對象可以創建命令對象。 然后,命令對象在接收器中調用暴露的方法。 因此,發送方對象不需要了解接收方及其公開的方法。
我們還有另一個稱為調用程序的對象。 調用程序是負責調用適當的命令對象以完成任務的對象。 我們還可以使用命令管理器來跟蹤,調用和操縱命令。
為什么要使用命令設計模式?
命令模式有一些流行的用例:
- 存儲和調度請求:我們可以將請求表示為命令對象,然后可以通過事件觸發器將其存儲在列表中,在特定時間進行操縱,排隊或完成。 例如,可以通過將警報振鈴表示為命令對象并在事件觸發器上執行警報振鈴功能來實現
- 支持完成/撤消:命令模式使我們能夠執行或撤消命令執行的操作
由于每個命令對象都支持do / undo操作,因此我們可以擴展此功能以設計文本編輯器的do / undo操作。 這個想法是有兩個命令對象列表– 歷史記錄和重做列表:
- 歷史記錄列表包含到目前為止已執行的所有命令
- 另一方面, 重做列表存儲我們撤消的命令
- 對于每個命令請求,都會創建,執行命令對象,然后將其添加到歷史記錄列表中
- 在撤消請求時,我們將檢查并在歷史記錄列表中的最新命令上調用撤消操作,然后將該命令放在重做列表中
- 對于重做操作,我們將使用重做列表上的最新命令,即最近撤消的命令,然后執行該命令并將其再次移至歷史記錄列表
聽起來很簡單吧!
UML表示形式:
我們可以將命令設計模式表示為:
我們在哪里
- 命令:定義命令對象操作的接口或抽象類。
- ConcreteCommand:這些是包含特定命令實際實現的具體類
- 接收器:命令類調用接收器以執行請求的操作
- 調用者:向客戶公開的類。 負責調用適當的命令
此外,每個命令類通常都提供以下方法的實現:
- execute():定義應該完成的工作
- unexecute():這是負責撤消操作的方法
- isReversible():如果可以撤消命令,則此方法應返回true ,否則返回false
示例實現:
假設我們必須為文本編輯器實現剪切復制粘貼功能。
因此,我們首先定義Command接口:
public interface Command {void execute();void unexecute();default boolean isReversible() {return true;} }另外,假設我們有一個支持文本插入和刪除的Document類:
//class which will be our Receiver public class Document {public void insert(String str, int position) {...}public String delete(int position, int noOfChars) {...}public void copy(int position, int noOfChars) {...} }編寫具體命令:
現在,我們將定義CutCommand類:
public class CutCommand implements Command {private Document doc;private String text;private int startPosition;private int noOfChars;//suitable constructorpublic void execute() {this.text = this.doc.delete(startPosition, noOfChars);}public void unexecute() {this.doc.insert(text, startPosition);} }我們還定義其他兩個命令類:
public class CopyCommand implements Command {private Document doc;private int startPosition;private int length;//suitable constructorpublic void execute() {this.doc.copy(startPosition, length);}public void unexecute() {System.out.println("Uncopy operation is blocked");}public boolean isReversible() { return false; } }public class PasteCommand implements Command {private Document doc;private String text;private int startPosition;//suitable constructorpublic void execute() {this.doc.insert(text, startPosition);}public void unexecute() {this.doc.delete(startPosition, text.length());} }眾所周知,取消復制不是有效的操作,我們在CopyCommand類的isReversible()方法中返回了false 。
實施調用者:
最后,我們可以編寫一個調用程序類:
public class DocumentInvoker {private Document document;private CommandManager commandManager;public DocumentInvoker(Document document) {this.document = document;commandManager = CommandManage.getInstance();}public void cut(int position, int length) {Command cutCommand = new CutCommand(document, position, length);commandManager.invoke(cutCommand);}public void copy(int position, int length) {Command copyCommand = new CopyCommand(document, position, length);commandManager.invoke(copyCommand);}public void paste(String text, int position) {Command pasteCommand = new PasteCommand(document, text, position);commandManager.invoke(pasteCommand);}}在這里, CommandManager是管理歷史記錄和重做列表的類。 調用程序使用所需的信息實例化命令對象,然后調用命令管理器以最終執行操作。
結論:
在本教程中,我們學習了如何在Java中實現命令設計模式。
由于發送方不需要了解任何有關接收方的信息,因此可以促進松散耦合,并且可以簡單地調用操作。
翻譯自: https://www.javacodegeeks.com/2019/09/command-design-pattern-in-java.html
java命令模式
總結
以上是生活随笔為你收集整理的java命令模式_Java中的命令设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开业备案申请(开门营业备案)
- 下一篇: java美元兑换,(Java实现) 美元