[英]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.