23 Образцы дизайна Глава 18: Меморандум Java
Определение: захватить внутреннее состояние объекта, не разрушая инкапсуляцию, и сохранить это состояние вне объекта. Это восстановит объект в его первоначальном сохраненном состоянии.
Тип: класс поведения
Классовая диаграмма:
Когда мы программируем, нам часто нужно сохранить промежуточное состояние объекта, и при необходимости мы можем восстановить его в этом состоянии. Например, когда мы используем Eclipse для программы, если мы совершаем ошибку в письменной форме (например, случайно удалили несколько строк кода), мы хотим вернуть статус перед удалением, чтобы мы могли использовать CTRL+Z для возврата. В настоящее время мы можем использовать режим меморандумы для его достижения.
Структура режима памяти
Инициатор: Запишите внутренний статус текущего момента, нести ответственность за определение того, какие состояния принадлежат к резервным сфере резервного копирования, и нести ответственность за создание и восстановление данных меморандума.
Меморандум: Отвечает за хранение внутреннего состояния объекта инициатора и предоставление внутреннего состояния, требуемого инициатором при необходимости.
Роль управления: управление меморандумом, сохранить и предоставлять меморандумы.
Общая реализация кода
класс оригинал {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 и т. Д.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.