23 Designmuster Kapitel 18: Java Memorandum Muster
Definition: Erfassen Sie den internen Zustand eines Objekts, ohne die Einkapselung zu zerstören, und speichern Sie diesen Zustand außerhalb des Objekts. Dadurch wird das Objekt in seinem ursprünglichen gespeicherten Zustand wiederhergestellt.
Typ: Verhaltensklasse
Klassendiagramm:
Wenn wir programmieren, müssen wir oft den Zwischenzustand des Objekts retten, und bei Bedarf können wir ihn in diesem Zustand wiederherstellen. Wenn wir beispielsweise Eclipse zum Programm verwenden, machen wir den Status vor dem Löschen, wenn wir schriftlich einen Fehler machen (z. Zu diesem Zeitpunkt können wir den Memo -Modus verwenden, um dies zu erreichen.
Struktur des Memo -Modus
Initiator: Erfassen Sie den internen Status des aktuellen Moments, sind Sie für die Definition verantwortlich, welche Zustände zum Sicherungsbereich gehören, und für die Erstellung und Wiederherstellung von Memorandum -Daten verantwortlich.
Memorandum: Verantwortlich für die Speicherung des internen Zustands des Initiatorobjekts und zur Bereitstellung des internen Zustands, den der Initiator bei Bedarf verlangt.
Managementrolle: Memorandums verwalten, Memorandums speichern und bereitstellen.
Allgemeine Code -Implementierung
Klasse Originator {private String state = ""; public String getState () {Return State; } public void setState (String Status) {this.state = STAAT; } public memento creatememento () {return New memento (this.state); } public void restorememento (memento memento) {this.setState (memento.getState ()); }} class memento {private String state = ""; public memento (String State) {this.state = STAAT; } public String getState () {Return State; } public void setState (String Status) {this.state = STAAT; }} Klasse für Hausmeister {private memento memento; public memento getMemento () {return memento; } public void setMemento (memento memento) {this.Memento = memento; }} public class Client {public static void main (String [] args) {Originator Originator = new Originator (); Originator.SetState ("Status 1"); System.out.println ("Anfangszustand:"+originator.getState ()); Hausmeister Hausmeister = neuer Hausmeister (); Caretaker.SetMemento (Originator.CreateMemento ()); Originator.SetState ("Status2"); System.out.println ("Status nach Änderung:"+originator.getState ()); Originator.Restorememento (Caretaker.getMemento ()); System.out.println ("Status nach Wiederherstellung:"+originator.getState ()); }} Der Code zeigt ein Beispiel für Einzelstaatenbackups. Die Logik ist sehr einfach: Die Statusvariable in der Urheberklasse muss gesichert werden, damit sie bei Bedarf wiederhergestellt werden kann. In der Memento -Klasse gibt es auch eine staatliche Variable, mit der der temporäre Zustand der Zustandsvariablen in der Urheberklasse gespeichert werden kann. und die Hausmeisterklasse wird verwendet, um die Memorandum -Klasse zu verwalten, mit der Zustände geschrieben oder Zustände in das Memorandum -Objekt abgerufen werden.
Multi-State-Multi-Backup-Memo
Im Beispiel der allgemeinen Codedemonstration hat die Urheberklasse nur eine staatliche Variable, die gesichert werden muss. In der Regel ist die Initiatorrolle in der Regel ein Javabäer. Dies ist ein Multi-Backup-Memo mit mehreren Staaten.
Es gibt viele Möglichkeiten, Memos umzusetzen. Es gibt viele Verformungen und Verarbeitungsmethoden für Memos. Methoden wie allgemeiner Code werden im Allgemeinen nicht verwendet. In den meisten Fällen sind Memos mehrstaatlich und mehrere Backups. Tatsächlich ist es auch sehr einfach, mehrstaatlich und mehrfach zu implementieren. Die am häufigsten verwendete Methode ist das Hinzufügen eines Kartenbehälters zum Memento, um alle Zustände zu speichern, und verwenden einen Kartenbehälter in der Kartierklasse, um alle Backups zu speichern. Im Folgenden geben wir ein Beispiel für Multi-State und Multi-Backup:
Klasse Originator {private String state1 = ""; private String state2 = ""; private String state3 = ""; public String getState1 () {return State1; } public void setState1 (String State1) {this.state1 = STATE1; } public String getState2 () {return state2; } public void setState2 (String State2) {this.state2 = state2; } public String getState3 () {return state3; } public void setState3 (String state3) {this.state3 = state3; } public memento creatememento () {return New memento (beanutils.backupprop (this)); } public void restorememento (memento memento) {beanutils.restoreProp (this, memento.getStatemap ()); } public String toString () {return "state1 ="+state1+"state2 ="+state2+"state3 ="+state3; }} class memento {private map <string, Object> Statemap; public memento (map <string, Objekt> map) {this.statemap = map; } public map <String, Objekt> getStatemap () {return Statemap; } public void setStatemap (MAP <String, Object> Statemap) {this.statemap = Statemap; }} class Beanutils {public static map <String, Objekt> Backupprop (Objektbean) {map <String, Objekt> result = new HashMap <String, Object> (); try {BeanInfo beanInfo = introspector.getBeanInfo (bean.getClass ()); PropertyDescriptor [] Descriptors = beanInfo.getPropertyDescriptors (); für (PropertyDescriptor Des: Descriptors) {String fieldname = Des.getName (); Methode getter = Des.getReadMethod (); Object fieldValue = getter.invoke (Bean, neues Objekt [] {}); if (! fieldname.equalSignoreCase ("Klasse")) {result.put (fieldname, fieldValue); }}}} catch (Ausnahme e) {e.printstacktrace (); } Rückgabeergebnis; } public static void restoreProp (Objektbean, Map <String, Object> propMap) {try {beanInfo beanInfo = introspector.getBeanInfo (Bean.getClass ()); PropertyDescriptor [] Descriptors = beanInfo.getPropertyDescriptors (); für (PropertyDescriptor Des: Descriptors) {String fieldname = Des.getName (); if (propMap.containsKey (fieldName)) {method setter = Des.getWritemethod (); setter.invoke (Bean, neues Objekt [] {propMap.get (fieldName)}); }}} catch (exception e) {e.printstacktrace (); }}} Klasse für Hausmeister {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 (); Hausmeister Hausmeister = neuer Hausmeister (); ori.setState1 ("China"); ori.setState2 ("stark"); ori.setState3 ("Wohlstand"); System.out.println ("=== Initialisierungsstatus ===/n"+ori); Caretaker.SetMemento ("001", Ori.CreateMemento ()); ori.setState1 ("Software"); ori.setState2 ("Struktur"); ori.setState3 ("ausgezeichnet"); System.out.println ("=== modifizierter Status ===/n"+ori); ori.restorememento (Caretaker.getMemento ("001")); System.out.println ("=== restaurierte Status ===/n"+ori); }} Vor- und Nachteile des Memorandum -Modus und anwendbaren Szenarien
Die Vorteile des Memo -Modus sind:
Wenn sich der Status in der Initiatorrolle ändert, kann dies eine falsche Änderung sein. Wir können diese falsche Änderung im Memo -Modus wiederherstellen.
Der Status der Sicherung wird außerhalb der Initiatorrolle gespeichert, sodass die Initiatorrolle nicht den Status jeder Sicherung verwalten muss.
Die Nachteile des Memo -Modus sind:
In den tatsächlichen Anwendungen ist der Memorandum-Modus Multi-State und Multi-Backup. Der Zustand der Initiatorrolle muss im Memorandum -Objekt gespeichert werden, das Ressourcen relativ stark verbraucht.
Wenn Sie Rollback -Operationen bereitstellen müssen, ist die Verwendung des Memo -Modus sehr geeignet, z. B. JDBC -Transaktionsvorgänge, Strg+Z -Wiederherstellung von Texteditoren usw.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.