В настоящее время я программирую небольшой текстовый редактор (проект для школы), и у меня возникают проблемы с поиском хорошего и чистого способа управления командами, которые нельзя отменить.
(Это не вопрос проверки кода, поскольку речь идет не только об улучшении. Мне нужно изменить код, если я хочу, чтобы мое приложение работало так, как я хочу)
Вот как работает мое приложение: у меня есть конкретная тема, которая содержит буфер, который на самом деле является массивом символов. Всякий раз, когда этот массив данных изменяется (вставка, вырезание, вставка ...), субъект обновляет наблюдателей - которые на данный момент состоят только из одного графического интерфейса - (шаблон MVC).
То, что я делал до сих пор для отмены и повтора, - это сохранение всего состояния буфера (через память), который работает нормально, но:
- очевидно может быть улучшено.
- не работает для новой функции, которую мне нужно реализовать (запись действий пользователя, чтобы он мог воспроизводить их в любое время)
Я не могу понять, как сохранить команды вместо буфера, и если это хороший путь.
Вот некоторые фрагменты программы (для команды вставки):
"GUI" .java
...
class KeyboardListener extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
...
commandManager.executeCommandInsert(caretStart, caretStop, e.getKeyChar());
...
}
...
}
CommandManager.java
...
public void executeCommandInsert(int start, int end, char character) {
addMementoUndo();
commandInsert.setCarets(start, end);
commandInsert.setChar(character);
commandInsert.execute();
}
public void addMementoUndo()
{
TextConcrete text = TextConcrete.getInstance();
this.commandsUndo.add(0, text.createMemento());
if(recordMode){
this.recordings.add(text.createMemento());
}
}
...
CommandInsert.java
...
public void execute(){
TextConcrete text = TextConcrete.getInstance();
text.insert(this.start, this.end, this.character);
}
...
TextConcrete.java
...
public void insert(int start, int end, char character){
//inserting in ArrayList
}
public CommandUndoable createMemento(){
CommandUndoable mem = new CommandUndoable();
mem.setState(getState());
return mem;
}
public String getState(){
StringBuilder temp = new StringBuilder();
for(int idx = 0; idx < this.state.size(); idx++){
temp.append(this.state.get(idx));
}
return temp.toString();
}
...
CommandUndoable - это просто сувенир, который сохраняет состояние буфера и затем сохраняется в списке сувениров в CareTaker (CommandManager).
Любая помощь будет принята с благодарностью.