Memento Design Pattern i Java

1. Oversikt

I denne opplæringen lærer vi hva Memento Design Pattern er og hvordan du bruker det.

Først vil vi gå gjennom litt teori. Deretter lager vi et eksempel der vi illustrerer bruken av mønsteret.

2. Hva er Memento Design Pattern?

Memento Design Pattern, beskrevet av Gang of Four i boken deres, er et mønster for atferdsmessig design. Memento Design Pattern tilbyr en løsning for å implementere angrebare handlinger. Vi kan gjøre dette ved å lagre tilstanden til et objekt på et gitt øyeblikk og gjenopprette det hvis handlingene som er utført siden må angres.

Praktisk kalles objektet hvis tilstand må lagres, en opphavsmann. Vaktmesteren er objektet som utløser lagring og gjenoppretting av staten, som kalles Memento.

Memento-objektet skal eksponere så lite informasjon som mulig for vaktmesteren. Dette er for å sikre at vi ikke utsetter Opphavsmannens interne tilstand for omverdenen, da det ville bryte innkapslingsprinsippene. Opprinneren skal imidlertid ha tilgang til nok informasjon for å gjenopprette til opprinnelig tilstand.

La oss se et raskt klassediagram som illustrerer hvordan de forskjellige objektene samhandler med hverandre:

Som vi kan se, kan Opphavsmannen produsere og konsumere et Memento. I mellomtiden beholder Vaktmesteren bare staten før den gjenoppretter den. Den opprinnelige representasjonen til Opphavsmannen holdes skjult for den ytre verden.

Her brukte vi et enkelt felt for å representere tilstanden til opphavsmannen vi er ikke begrenset til ett felt og kunne ha brukt så mange felt som nødvendig. I tillegg trenger ikke staten i Memento-objektet å matche fullstendig tilstand til Opphavsmannen. Så lenge den oppbevarte informasjonen er tilstrekkelig for å gjenopprette tilstanden til Opphavsmannen, er vi klare.

3. Når skal du bruke Memento Design Pattern?

Vanligvis vil Memento Design Pattern brukes i situasjoner der noen handlinger kan angres, og derfor krever tilbakestilling til en tidligere tilstand. Imidlertid, hvis tilstanden til opphavsmannen er tung, kan bruk av Memento designmønster føre til en kostbar opprettelsesprosess og økt bruk av minne.

4. Eksempel på Memento Pattern

4.1. Første prøve

La oss nå se et eksempel på Memento Design Pattern. La oss forestille oss at vi har en tekstredigerer:

offentlig klasse TextEditor {privat TextWindow textWindow; public TextEditor (TextWindow textWindow) {this.textWindow = textWindow; }}

Den har et tekstvindu som inneholder den inntastede teksten, og gir en måte å legge til mer tekst:

offentlig klasse TextWindow {private StringBuilder currentText; offentlig TextWindow () {this.currentText = ny StringBuilder (); } public void addText (String text) {currentText.append (text); }}

4.2. Minne

La oss forestille oss at vi vil at tekstredigereren skal implementere noen lagrings- og angrefunksjoner. Når du lagrer, vil vi at vår nåværende tekst skal lagres. Når vi angrer påfølgende endringer, vil vi altså gjenopprette den lagrede teksten.

For å gjøre det, vil vi bruke Memento Design Pattern. Først oppretter vi et objekt som inneholder den gjeldende teksten i vinduet:

offentlig klasse TextWindowState {privat strengtekst; offentlig TextWindowState (strengtekst) {this.text = tekst; } offentlig String getText () {returtekst; }}

Dette objektet er vårt Memento. Som vi ser, velger vi å bruke String i stedet for StringBuilder for å forhindre oppdatering av gjeldende tekst av utenforstående.

4.3. Opphavsmann

Etter det må vi oppgi TextWindow klasse med metoder for å lage og konsumere Memento-objektet, noe som gjør TextWindow vår opphavsmann:

public TextWindowState save () {return new TextWindowState (wholeText.toString ()); } offentlig ugyldig gjenoppretting (TextWindowState lagring) {currentText = ny StringBuilder (save.getText ()); }

De lagre() metoden lar oss lage objektet, mens restaurere() metoden bruker den for å gjenopprette forrige tilstand.

4.4. Vaktmester

Endelig må vi oppdatere vår TextEditor klasse. Som vaktmester vil den ha tilstanden til opphavsmannen og be om å gjenopprette den når det er nødvendig:

privat TextWindowState savedTextWindow; offentlig ugyldig hitSave () {savedTextWindow = textWindow.save (); } offentlig ugyldig hitUndo () {textWindow.restore (savedTextWindow); }

4.5. Testing av løsningen

La oss se om det fungerer gjennom en prøvekjøring. Tenk deg at vi legger til litt tekst i redaktøren vår, lagrer den, så legger til litt mer og til slutt angrer. For å oppnå det, legger vi til en skrive ut() metode på vår TextEditor som returnerer a String av gjeldende tekst:

TextEditor textEditor = ny TextEditor (ny TextWindow ()); textEditor.write ("The Memento Design Pattern \ n"); textEditor.write ("Hvordan implementere det i Java? \ n"); textEditor.hitSave (); textEditor.write ("Kjøp melk og egg før du kommer hjem \ n"); textEditor.hitUndo (); assertThat (textEditor.print ()). isEqualTo ("The Memento Design Pattern \ nHvordan implementerer du det i Java? \ n");

Som vi kan se, er den siste setningen ikke en del av den gjeldende teksten, siden Memento ble lagret før den ble lagt til.

5. Konklusjon

I denne korte artikkelen forklarte vi Memento Design Pattern og hva det kan brukes til. Vi har også gått gjennom et eksempel som illustrerer bruken i en enkel tekstredigerer.

Den fulle koden som brukes i denne artikkelen, finner du på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found