Я должен реализовать основу Отмены/Восстановления для своего приложения окна (редактор как powerpoint), что должно быть лучшей практикой для следования, как был бы дескриптор все изменения свойства моих объектов и этого отражение о UI.
Можно использовать два классических шаблона. Первый - это шаблон памятки , который используется для хранения снимков полного состояния вашего объекта. Возможно, это более ресурсоемкая процедура, чем шаблон команды, но он позволяет очень просто выполнить откат к более раннему моментальному снимку. Вы можете хранить снимки на диске как PaintShop / PhotoShop или хранить их в памяти для небольших объектов, которые не требуют сохранения. То, что вы делаете, - это именно то, для чего был разработан этот шаблон, поэтому он должен соответствовать требованиям немного лучше, чем шаблон Command, предложенный другими.
Кроме того, дополнительное примечание заключается в том, что, поскольку это не требует от вас взаимных команд для отмены того, что было сделано ранее, это означает, что любые потенциально односторонние функции [такие как хеширование или шифрование], которые могут ' тривиально отменить его с помощью взаимных команд все же можно очень просто, просто откатившись к более старому снимку.
Также, как уже указывалось, шаблон команд , который потенциально требует меньших ресурсов, поэтому я признаю что в особых случаях, когда:
, шаблон команды может подойти лучше [но не обязательно, это будет во многом зависеть от ситуации]. В других случаях я бы использовал узор на память.
Я бы, вероятно, воздержался от использования их двух приложений, потому что я склонен заботиться о разработчике, который ' Я собираюсь прийти за мной и поддерживать мой кодекс, а также моя этическая ответственность перед моим работодателем - сделать этот процесс как можно более простым и недорогим. Я вижу, что смесь этих двух паттернов легко превращается в непреодолимую дыру дискомфорта, которую было бы дорого поддерживать.
Классическая практика - следовать шаблону команд .
Вы можете инкапсулировать любой объект, который выполняет действие с помощью команды, и заставить его выполнять обратное действие с помощью метода Undo (). Вы сохраняете все действия в стеке, чтобы их было легко перемотать.
Взгляните на шаблон команды . Вы должны инкапсулировать каждое изменение вашей модели в отдельные командные объекты.