簡體   English   中英

努力了解如何在Java中實現命令模式設計

[英]Struggling to understand how to implement the Command Pattern Design in Java

作為項目的一部分,我必須重構一些代碼,並且我認為我應該實現命令模式設計,但是我從多個角度進行了研究,並不斷遇到問題。 到目前為止,我只是試圖從頭開始創建一些東西,但是它具有我認為需要的所有功能。

我需要創建一個可以運行編輯器的程序,反復詢問用戶的命令,解析這些命令並調用適當的函數,直到調用“ quit”命令,然后程序退出。 所需的一些功能是:正在工作的“ currentImage”(示例命令可能是,打開,保存,單聲道等),可以存儲要處理的圖像的“緩存”(我可以在其中“獲取”和“放置”圖像”),例如“上方”的命令,將一個圖像放置在另一個圖像上方。

如果我有一個Editor類,可能看起來像這樣:

 public class Editor {
      private ArrayList<Image> cache;
      private Image currentImage;

      private Parser parser;

      public Editor(){
           cache = new ArrayList<Image>();
           parser = new Parser();
      }

      public void edit() {
           boolean finished = false;

           while (!finished) {
                command = parser.getCommand();
                finished = command.execute(command.getArgs())
           }
      }

      public boolean aNormalCommand(SomeType args) {
           //Do interesting things with args
           return false;
      }

      public boolean quit(SomeType args) {
           //Check that the args make sense
           return true;
      }

      //
      // more normal functions
      //
 }

我堅持的事情:

  • 如何使其實際執行所需的命令。
  • 如何正確解析輸入,以便我可以檢查在有效命令中傳遞的用戶。 我看過使用枚舉和/或哈希圖。
  • 如何簡化實際添加新功能的過程。

當我考慮將Command設置為一個接口,該接口實現了execute和undo,然后為每個采用該對象的函數創建類時,我遇到了用戶想要更改當前圖像的問題-這將需要額外的操作東西來切換圖像,然后是新的對象,為正確的對象攜帶新的對象。

當我考慮過如何實現lambda時,我不確定如何使它在正確的對象上工作。 當我查看反射時,我的命令需要以某種方式找出應該對哪個對象進行操作,而我不知道解析器如何找出該對象。

就“撤消”而言,我曾考慮過擁有一個保存過濾器歷史的ArrayList,而撤消操作只是將最后一個作為當前過濾器(這也解決了具有不可撤消方法的問題)

希望您能告訴我,我的Editor類不應看起來像這樣,所有內容都將落入原處。

您的編輯器類必須包含執行所需命令所需的字段。

所需的一些功能包括:正在工作的“ currentImage”(示例命令可能是,打開,保存,單聲道等),

您的編輯器類中有一個當前圖像。 它可能需要是一個BufferedImage,以便您可以執行某些命令。

可以存儲處理圖像的“緩存”(可以在其中“獲取”和“放入”圖像),

創建緩存的一種方法是擁有BufferedImages列表。

例如“上方”的命令,將一個圖像放置在另一個圖像之上。

現在,BufferedImage必須具有位置信息。 您可能需要創建一個子類,以僅保存Point或Rectangle以獲得位置信息和BufferedImage。

一旦有了一個包含所有必要字段的類(包括所有子類),便可以為命令創建接口。 這是一個例子。

public interface Command {

    public boolean isCommand(String command);
    public boolean processCommand(String command);
    public int executeCommand();

}

isCommand方法標識命令。 “撤消”就是一個例子。 對於“撤消”命令字符串,撤消類將返回true。

processCommand方法解析命令。 “將圖像3移動到位置5”是必須分析的命令的示例。 如果命令正確解析和驗證,則返回true,否則返回false。

executeCommand執行命令。 返回一些指示符以指示命令已正確執行。 我用了一個整數。 您可以使用一個枚舉。

Editor類將通過構造函數傳遞給實現此Command接口的具體類。

在一個模型類中,創建一個Command實例列表。 然后,將實現Command接口的具體類添加到List。

您可以這樣處理命令:

public int processCommand(String command) {
    for (Command commandObject : listOfCommands) {
        if (commandObject.isCommand(command)) {
            if (commandObject.processCommand(command)) {
                int response = commandObject.executeCommand();
                return response;
            } else {
                return -1;
            }
        }
    }

    return -2;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM