Inhoudsopgave:
Video: Inzicht in Omgevingsrecht 2024
Met het ontwerppatroon van de waarnemer kunnen verschillende waarnemingsobjecten worden gewaarschuwd wanneer een onderwerpobject op de een of andere manier wordt gewijzigd. Elke waarnemer registreert zich bij het onderwerp en wanneer een verandering plaatsvindt, stelt het onderwerp ze allemaal op de hoogte. Elk van de waarnemers wordt gelijktijdig op de hoogte gesteld (dat wil zeggen, op hetzelfde moment).
Een onderwerpinterface maken
Wanneer u een ontwerppatroon implementeert, is het vaak een goed idee om te beginnen met het maken van een interface om ervoor te zorgen dat de objecten die u maakt zich zullen aanpassen aan het patroon dat u probeert te gebruiken - vooral als meerdere objecten zijn betrokken. Het implementeren van die interface - programmeren naar een interface zoals die wordt genoemd - houdt je code in lijn en houdt meestal dingen duidelijker.
Wanneer je het Waarnemingspa- troon in code zet, maak dan een interface of abstracte klasse voor de waarnemers; je hebt meestal meerdere waarnemers en je moet de methoden die ze implementeren consistent houden.
In dit voorbeeld moet u ook een interface voor het onderwerp instellen, wat de waarnemers bekijken; de Onderwerp-interface geeft de methoden weer die proefpersonen moeten implementeren. Zet hier een methode registerObserver, zodat het onderwerp waarnemers die willen worden geregistreerd kan volgen. Naast het registreren van waarnemers, zou je een manier moeten hebben om er vanaf te komen, dus voeg een removeObserver-methode toe. En er is een notifyObservers-methode die de waarnemers op de hoogte brengt van een verandering.
openbare interface Onderwerp
{
public void registerObserver (Observer o);
openbare inhoud removeObserver (Observer o);
openbare kennisgeving notifyObservers ();
}
Deze interface geeft de methoden weer die onderwerpen zoals het databasesysteem moeten implementeren. De volgende: de interface voor de waarnemers.
Een observatorinterface maken
Het bouwen van de waarnemingsinterface, geïmplementeerd door de waarnemers om hen in staat te stellen meldingen te ontvangen, is eenvoudig. Alles wat u nodig hebt, is een methode die wordt aangeroepen wanneer een nieuwe melding gereed is (u kunt die methode-update noemen). In dit voorbeeld geeft u de bewerkte databasebewerking door (zoals "bewerken", "verwijderen", "maken" enzovoort) en de record die als strings is gewijzigd in de updatemethode.
publieke interface Observer
{
openbare ongeldige update (String-bewerking, Stringrecord);
}
Wanneer waarnemers de updatemethode implementeren, kan het onderwerp ze doorgeven aan het betreffende record en de bewerking die werd uitgevoerd.
Oké, je bent klaar om te gaan. Het is tijd om het databaseonderwerp te maken dat de waarnemers in de gaten houdt en hen op de hoogte brengt wanneer er een wijziging is opgetreden.
Een onderwerp maken
Het onderwerp moet waarnemers registreren en moet hen op de hoogte stellen wanneer een gebeurtenis plaatsvindt. Volgens de Subject-interface zijn de drie methoden die een onderwerp moet implementeren in deze voorbeelden: registerObserver, removeObserver en notifyObservers. Dat is wat de klasse Database doet in dit voorbeeld.
Om de waarnemers bij te houden, gebruikt u een Java-vector met de naam waarnemers, gemaakt in de Database-constructor. (De type-aanduiding hier, is voor Java 1. 5 of hoger en geeft aan dat elk waarnemersobject de Observer-interface implementeert; als u een eerdere versie van Java gebruikt, laat dan de typespecificatie weg.)
java importeren. util. *;
Public Class Database implementeert Subject
{
private Vector-waarnemers;
openbare database ()
{
waarnemers = nieuwe vector ();
}
.
.
.
}
Wanneer u een vector gebruikt, is het bijhouden van waarnemers heel eenvoudig. Wanneer een waarnemer zich wil registreren, roept hij de methode registerObserver van het onderwerp aan, die zichzelf als object doorgeeft. Het onderwerp - een object van onze Database-klasse - hoeft alleen die waarnemer toe te voegen aan de waarnemersvector in de methode registerObserver, met behulp van de add-methode van de Vector-klasse.
java importeren. util. *;
Public Class Database implementeert Subject
{
private Vector-waarnemers;
openbare database ()
{
waarnemers = nieuwe vector ();
}
public void registerObserver (Observer o)
{
waarnemers. voeg (o);
}
.
.
.
}
Hoe zit het met het verwijderen van een waarnemer van de waarnemersvector? Geen probleem. Wanneer u een object uit een vector wilt verwijderen, kunt u de verwijdermethode van de vector gebruiken; Dit is hoe dat werkt in de removeObserver-methode van de klasse Database:
java importeren. util. *;
Public Class Database implementeert Subject
{
private Vector-waarnemers;
openbare database ()
{
waarnemers = nieuwe vector ();
}
public void registerObserver (Observer o)
{
waarnemers. voeg (o);
}
openbare nietige removeObserver (Observer o)
{
waarnemers. Verwijder (o);
}
.
.
.
}
Wanneer de gebruiker daadwerkelijk iets met de database doet - bijvoorbeeld een record verwijderen - roept hij de editRecord-methode van de klasse Database aan. Als u bijvoorbeeld record 1 wilt verwijderen, kunt u deze methode als volgt noemen:
database. editRecord ("verwijderen", "record 1");
Zo ziet de editRecord-methode eruit: Wanneer deze methode wordt aangeroepen, geeft u deze de databasewerking door die u wilt uitvoeren en de record waaraan u wilt werken, beide als tekenreeksen in dit voorbeeld. Die snaren worden opgeslagen zodat ze kunnen worden doorgegeven aan de waarnemers. Nadat de tekenreeksen zijn opgeslagen, wordt de methode notifyObservers, die hierna verschijnt, opgeroepen om alle waarnemers op de hoogte te stellen.
java importeren. util. *;
Public Class Database implementeert Subject
{
private Vector-waarnemers;
privéreeksbewerking;
private String record;
openbare database ()
{
waarnemers = nieuwe vector ();
}
.
.
.
public void editRecord (String-bewerking, tekenreeksrecord)
{
dit.operatie = operatie;
dit. record = record;
notifyObservers ();
}
}
Hier is het vlees van de code, het deel dat elke waarnemer waarschuwt dat er een wijziging heeft plaatsgevonden: de notifyObservers-methode. Elke waarnemer implementeert de Observer-interface van dit voorbeeld - wat betekent dat het een updatemethode heeft - dus notifyObservers hoeft alleen maar alle geregistreerde waarnemers in de waarnemersvector te doorlopen, waarbij de iemands updatemethode wordt aangeroepen met de databasebewerking en het betreffende record.
java importeren. util. *;
Public Class Database implementeert Subject
{
private Vector-waarnemers;
privéreeksbewerking;
private String record;
.
.
.
public void notifyObservers ()
{
for (int loopIndex = 0; loopIndex Observer observer = (Observer) waarnemers. te krijgen (loopIndex); waarnemer. update (bewerking, record); } } public void editRecord (String-bewerking, tekenreeksrecord) { dit. operatie = operatie; dit. record = record; notifyObservers (); } } Dat is alles wat u nodig heeft voor Database. java, het onderwerp in dit voorbeeld. Het onderwerp laat waarnemers zichzelf registreren, de registratie ongedaan maken en een melding ontvangen wanneer een databaserecord is bewerkt (wat u doet met de editRecord-methode van de klasse Database). Het enige wat je hoeft te doen om deze show onderweg te krijgen, is door de waarnemers zelf te maken.