Определение и структура
Режим памяти также называется режим токена. GOF определяет режим меморандумы как: без уничтожения инкапсуляции, захватывает внутреннее состояние объекта и сохраните это состояние за пределами объекта. Таким образом, объект может быть восстановлен до его первоначального сохраненного состояния позже.
Говоря о командном режиме, мы однажды упомянули, что использование роли промежуточной команды может реализовать функции Undo и Redo. Из определения мы видим, что режим меморандумы специально используется для хранения исторического состояния объекта, который очень полезен для хорошего реализации функций отмены и повторно. Следовательно, в командном режиме функции отмены и повторения могут быть реализованы в сочетании с режимом заметки.
Фактически, все еще очень просто просто реализовать функцию сохранения состояния объекта в определенный момент - поместить атрибуты для сохранения в объекте в объект, который специализируется на управлении резервным копированием, и вызвать согласованный метод, чтобы вернуть атрибуты резервного копирования обратно в исходный объект, когда это необходимо. Но вы должны хорошо взглянуть, чтобы ваш объект резервного копирования мог получить доступ к свойствам в исходном объекте, значит ли вы раскрыть все свойства исходных частных объектов в пакете? Если ваш подход сломал инкапсуляцию, то вам следует рассмотреть вопрос о рефактории.
Режим меморандума - это всего лишь общее решение, предложенное GOF для вопроса о «восстановлении исходного состояния объекта в определенное время». Следовательно, с точки зрения того, как поддерживать инкапсуляцию - из -за таких факторов, как языковые характеристики, схема меморандума не описана подробно, а только объясняет идеи, основанные на C ++.
1) Роль Memento: Роль Меморандума хранит внутренний статус «Роли инициатора меморандума». «Роль инициатора меморандума» определяет, какие внутренние состояния «роли инициатора меморандума» хранятся по мере необходимости. Чтобы предотвратить другие объекты, отличные от «роли инициатора меморандума», чтобы получить доступ к запискам. У заведений на самом деле есть два интерфейса. «Роль менеджера меморандумы» может видеть только узкий интерфейс, предоставляемый меморандумом - она невидима для атрибутов, хранящихся в роли меморандумы. «Роль инициатора меморандума» может увидеть широкий интерфейс - вы можете получить атрибуты, которые вы вкладываете в роль меморандума.
2) Роль инициации памяти (создатель): «Роль инициации меморандумы» создает меморандум для записи своего внутреннего состояния в настоящий момент. Используйте памятки, чтобы восстановить внутреннее состояние, когда это необходимо.
3) Менеджер меморандума (опекун) Роль: Ответственность за сохранение записок. Содержание меморандумы не может работать или проверить.
Классовая диаграмма режима заметки действительно проста:
Общая реализация кода
класс оригинал {private String state = ""; public String getState () {return State; } public void setState (String state) {this.state = state; } public memento creatememento () {return new memento (this.state); } public void restorememento (memento memento) {this.setState (memento.getState ()); }} класс memento {private String state = ""; public Memento (String State) {this.state = state; } public String getState () {return State; } public void setState (String state) {this.state = state; }} Класс -смотритель {Private Memento Memento; public memento getMemento () {return memento; } public void setMemento (memento memento) {this.memento = memento; / Originator.SetState ("Статус 1"); System.out.println («Начальное состояние:»+inigorator.getState ()); Смотритель CareTaker = New CareTaker (); CareTaker.SetMemento (Originator.CreateMemento ()); Originator.SetState ("centus2"); System.out.println ("Статус после изменения:"+Originator.getState ()); Originator.RestoreMemento (Caretaker.getMemento ()); System.out.println ("Статус после восстановления:"+Originator.getState ()); }}Код демонстрирует пример отдельного резервного копирования. Логика очень проста: переменная состояния в классе оригинала должна быть резервирована, чтобы ее можно было восстановить, когда это необходимо; В классе Memento также существует переменная состояния, используемая для хранения временного состояния переменной состояния в классе оригинала; и класс смотрителя используется для управления классом меморандума, который используется для написания состояний или извлечения состояний в объект меморандума.
Multi-State Multi-Backup Memo
В примере демонстрации общего кода у класса создателя есть только одна переменная состояния, которую необходимо подкрепить, в то время как обычно роль инициатора обычно представляет собой Javabean, существует более одной переменной, которые необходимо подкрепить в объекте, и более одного состояния, которое необходимо подтвердить. Это многогосударственная мульти-боковая памятка. Есть много способов внедрить записки. Есть много деформаций и методов обработки для записок. Такие методы, как общий код, обычно не используются. В большинстве случаев записки являются многогосударственными и многочисленными резервными копиями. На самом деле, также очень просто внедрить многогосударственные и многофункциональные. Наиболее часто используемым методом является добавление контейнера для карты в сувенир для хранения всех состояний и использования контейнера для карты в классе смотрителя для хранения всех резервных копий. Ниже мы приводим пример мультиголовного и многооборотного:
класс оригинал {частная строка State1 = ""; частная строка State2 = ""; частная строка State3 = ""; public String getState1 () {return state1; } public void setState1 (String State1) {this.state1 = state1; } public String getState2 () {return state2; } public void setState2 (String atation2) {this.state2 = state2; } public String getState3 () {return State3; } public void setState3 (String State3) {this.state3 = state3; } public memento creatememento () {return new memento (beanatils.backupprop (this)); } public void RestoreMemento (Memento Memento) {beanatils.RestoreProp (this, memento.getStateMap ()); } public String toString () {return "state1 ="+state1+"state2 ="+state2+"state3 ="+state3; }} класс memento {private map <string, object> statemap; public memento (map <string, object> map) {this.statemap = map; } public Map <string, Object> getStateMap () {return StateMap; } public void setStateMap (map <string, object> statemap) {this.statemap = statemap; }} class beanutils {public static map <string, object> backupprop (объект bean) {map <string, object> result = new Hashmap <string, object> (); try {beaninfo beaninfo = Interospepper.getbeaninfo (bean.getClass ()); PropertyDescriptor [] descriptors = beaninfo.getPropertyDescriptors (); для (PropertyDescriptor des: descriptors) {string fieldname = des.getName (); Метод getter = des.getReadMethod (); Object FieldValue = getter.invoke (Bean, новый объект [] {}); if (! fieldname.equalsignorecase ("class")) {result.put (fieldname, fieldvalue); }}}} catch (Exception e) {e.printstacktrace (); } return Result; } public static void RestoreProp (Object Bean, Map <String, Object> propmap) {try {beaninfo beaninfo = Interspepper.getbeaninfo (bean.getClass ()); PropertyDescriptor [] descriptors = beaninfo.getPropertyDescriptors (); для (PropertyDescriptor des: descriptors) {string fieldname = des.getName (); if (propmap.containskey (fieldname)) {method setter = des.getWritemethod (); setter.invoke (bean, new Object [] {propmap.get (fieldname)}); }}} catch (Exception e) {e.printstackTrace (); }}} класс Caretaker {Private Map <String, memento> memmap = new Hashmap <String, memento> (); public Memento getMemento (String Index) {return memmap.get (index); } public void setMemento (String Index, Memento Memento) {this.memmap.put (index, memento); }} class client {public static void main (string [] args) {Originator ori = new Originator (); Смотритель CareTaker = New CareTaker (); ori.setState1 ("Китай"); ori.setState2 ("strong"); ori.setState3 («Процветание»); System.out.println ("=== Статус инициализации ===/n"+ori); CareTaker.SetMemento ("001", ori.creatememento ()); ori.setState1 («Программное обеспечение»); ori.setState2 («структура»); ori.setState3 («Отлично»); System.out.println ("=== Модифицированный статус ===/n"+ori); ori.restorememento (caretaker.getmemento ("001")); System.out.println ("=== восстановленное состояние ===/n"+ori); }} Преимущества и недостатки режима меморандума и преимущества режима меморандума для применимых сценариев:
Когда статус в роли инициатора меняется, это может быть неправильным изменением. Мы можем восстановить это неправильное изменение, используя режим памяти.
Статус резервной копии сохраняется вне роли инициатора, поэтому роль инициатора не должна управлять статусом каждой резервной копии.
Недостатки режима памяти:
В фактических приложениях режим меморандума является многогосударственным и многофункциональным. Состояние роли инициатора должно храниться в объекте Меморандума, который относительно сильно потребляет ресурсы.
Если вам нужно предоставить операции с откатом, использование режима Memo очень подходит, например, операции транзакций JDBC, восстановление текстовых редакторов CTRL+Z и т. Д.