Innholdsfortegnelse:
Video: Double Slit Experiment explained! by Jim Al-Khalili 2024
Observer-designmønsteret lar flere observatørobjekter bli varslet når et objektobjekt endres på en eller annen måte. Hver observatør registrerer med emnet, og når en endring skjer, underretter subjektet dem alle. Hver av observatørene blir varslet parallelt (det vil si samtidig).
Opprette et faggrensesnitt
Når du implementerer et mønster, er det ofte en god ide å begynne med å lage et grensesnitt for å sikre at objektene du lager, holder seg til mønsteret du prøver å bruke - spesielt hvis Flere objekter er involvert. Implementere det grensesnittet - programmering til et grensesnitt som det kalles - holder koden på linje og holder ting klarere.
Når du legger Observer-mønsteret inn i koden, sett opp et grensesnitt eller abstrakt klasse for observatørene; du vil vanligvis ha flere observatører, og du må holde metodene de implementerer konsistent.
I dette eksemplet må du også sette opp et grensesnitt for motivet, noe som observatørene ser på; Emne grensesnittet viser metodene som fagene må implementere. Sett en registerObserver metode her slik at emnet kan holde oversikt over observatører som ønsker å bli registrert. Foruten å registrere observatører, bør du ha noen måte å bli kvitt dem, så legg til en removeObserver metode. Og det er en notifyObservers metode som vil varsle observatørene om noen endringer.
offentlige grensesnitt Emne
{
offentlig tomt registerObserver (Observer o);
offentlig ugyldig removeObserver (Observer o);
offentlig ugyldig melding ();
}
Dette grensesnittet viser metodene som emner som databasesystemet skal implementere. Neste opp: grensesnittet for observatørene.
Opprette et observatørgrensesnitt
Bygg Observer-grensesnittet, implementert av observatørene for å gjøre det mulig for dem å få varsler, er enkelt. Alt du trenger er en metode som vil bli kalt når et nytt varsling er klart (du kan ringe til datautdateringen). I dette eksemplet passerer du databasen operasjonen som ble utført (for eksempel "redigere", "slette", "lage" og så videre) og posten som ble endret som strenger til oppdateringsmetoden.
offentlig grensesnitt Observer
{
offentlig ugyldig oppdatering (Stringoperasjon, String record);
}
Når observatører implementerer oppdateringsmetoden, kan emnet overføre dem posten som ble berørt og operasjonen som ble utført.
Ok, du er god å gå. Det er på tide å lage Database-emnet som skal holde styr på observatørene og varsle dem når det har skjedd en endring.
Opprette et emne
Faget må la observatører registrere og må varsle dem når en hendelse oppstår. Ifølge Emne grensesnittet, må de tre metodene et emne har å implementere i disse eksemplene: registerObserver, removeObserver, og notifyObservers. Det er det databaseklassen gjør i dette eksemplet.
For å holde oversikt over observatørene, bruk en Java-vektor som heter observatører, opprettet i Database-konstruktøren. (Typespesifikatoren her, er for Java 1. 5 eller nyere og indikerer at hvert observasjonsobjekt implementerer Observer-grensesnittet, hvis du bruker en tidligere versjon av Java, slipper du typespesifikatoren.)
Importer java. util. *;
Public Class Database implementerer Emne
{
Private Vector observatører;
offentlig database ()
{
observatører = ny vektor ();
}
.
.
.
}
Når du bruker en vektor, er det enkelt å holde oversikt over observatører. Når en observatør ønsker å registrere, kaller den fagets registerObserver-metode, som overfører seg som et objekt. Faget - et objekt av databaseklassen - må bare legge til observatøren til observatørvektoren i registerObserver-metoden, ved å bruke vektorklassens tilleggsmetode.
importer java. util. *;
Public Class Database implementerer Emne
{
Private Vector observatører;
offentlig database ()
{
observatører = ny vektor ();
}
offentlig ugyldig registerObserver (Observer o)
{
observatører. til (o);
}
.
.
.
}
Hva med å fjerne en observatør fra observatørvektoren? Ikke noe problem. Når du vil fjerne et objekt fra en vektor, kan du bruke vektorens fjerningsmetode; Slik fungerer det i databaseklassens removeObserver-metode:
importer java. util. *;
Public Class Database implementerer Emne
{
Private Vector observatører;
offentlig database ()
{
observatører = ny vektor ();
}
offentlig ugyldig registerObserver (Observer o)
{
observatører. til (o);
}
offentlig ugyldig removeObserver (Observer o)
{
observatører. fjerne (o);
}
.
.
.
}
Når brukeren faktisk gjør noe med databasen - sletter en plate, for eksempel - han kaller databaseklassens redigeringsmetode. For eksempel, for å slette post 1, kan du ringe denne metoden slik:
database. editRecord ("delete", "record 1");
Dette er hvordan redigeringsmetoden ser ut: Når denne metoden kalles, sender du den databaseoperasjonen du vil utføre, og posten du vil jobbe med, både som strenge i dette eksemplet. Disse strengene lagres slik at de kan sendes videre til observatørene. Etter at strengene er lagret, kalles notifyObservers-metoden, som kommer opp neste, for å varsle alle observatører.
importer java. util. *;
Public Class Database implementerer Emne
{
Private Vector observatører;
Private String-operasjon;
Private String Record;
offentlig database ()
{
observatører = ny vektor ();
}
.
.
.
offentlig ugyldig redigeringRecord (Stringoperasjon, String record)
{
dette.operasjon = operasjon;
dette. rekord = rekord;
notifyObservers ();
}
}
Her er kjøttet av koden, den delen som varsler hver observatør om at det har skjedd en endring: notifyObservers-metoden. Hver observatør implementerer dette eksempelets Observer-grensesnitt - som betyr at det har en oppdateringsmetode - så varsling. Observere må bare sløyfe over alle registrerte observatører i observatørvektoren, og kaller hver enkelt oppdatasjonsmetode med databasedriften og berørt plate.
importer java. util. *;
Public Class Database implementerer Emne
{
Private Vector observatører;
Private String-operasjon;
Private String Record;
.
.
.
offentlig ugyldig melding ()
{
for (int loopIndex = 0; loopIndex Observer observatør = (Observer) observatører. få (loopIndex); observatør. oppdatering (drift, rekord); } } offentlig ugyldig redigeringRecord (Stringoperasjon, String record) { dette. operasjon = operasjon; dette. rekord = rekord; notifyObservers (); } } Det er alt du trenger for Database. java, emnet i dette eksemplet. Faget vil la observatører registrere seg, avregistrere seg selv og bli varslet når en databaseoppføring er redigert (som du gjør med databaseklassens redigeringsmetode). Alt som er igjen å gjøre for å få dette showet på veien, er å skape observatørene selv.