На самом деле, похоже, что действие UNDO обеспечивает большинство редакторов, но с другим процессом "обработки версий".
Чтобы реализовать стратегию Volatile (как описано), я бы использовал структуру данных, чтобы сохранить версии документа. Например, HashMap<Integer, Document>
, который сохраняет версии документа в качестве ключей, а клоны документов - в качестве значений. Поэтому, когда я хочу перейти к предыдущей версии, я просто делаю это следующим образом:
private void goToPreviousVersion(Document doc)
{
Document oldVersion = hashmap.get(doc.getVersionId());
doc.setContent(oldVersion);
//copy all properties from old version the the document
//Update the view (GUI)
}
Теперь сохранение версии должно быть простым. Что-то вроде:
private void saveVersion(Document doc)
{
hashmap.put(doc.getVersionId(), doc.clone());
doc.setVersionId(doc.getVersionId +1);
}
То же самое относится и к Стабильной стратегии, но вместо структуры данных вы сохраняете клоны на жестком диске с именами, которые вы можете искать позже, чтобы вернуться назад. Например, версия1, версия2, версия3 и т. Д. Если вы хотите вернуться назад, просто загрузите файл «версия» + (document.getVersionId-1).
Об изменении стратегии версий в любое время легко. Создайте классы, которые представляют эти механизмы версий (например, VolatileStrategy, StableStrategy) и добавьте к ним отношение. Может быть сделано через родительский класс (VolatileStrategy extends VersionStrategy
) или, возможно, через интерфейс (что я бы предпочел), например VolatileStrategy implements VersionStrategy
. Наконец, сохраните ссылку на активную стратегию private VersionStrategy versionStrategy;
, и всякий раз, когда вы захотите ее изменить, просто:
versionStrategy = new StableStrategy();
Сохранение версий может быть сделано разными способами. Один из простых способов - добавить в графический интерфейс кнопку с названием «Сохранить версию». При щелчке по нему сохраняется версия документа. Другой способ, наиболее распространенный во всех редакторах (но более сложный для реализации), заключается в использовании таймера.
При нажатии клавиши в текстовом поле запускается таймер, скажем, на 300 мс. Если другая клавиша нажата до 300 мс, таймер перезапускается. Если в течение 300 мс ничего не нажимается, таймер сохраняет версию документа и останавливается. Затем при следующем нажатии клавиши таймер запускается снова, и этот процесс повторяется.
Если вам интересно реализовать второй способ, но вы никогда раньше не работали с таймерами Swing, взгляните на Как использовать таймеры в колебании.