Innehållsförteckning:
Video: 2.2 Mönster och formler (aritmetisk talföljd, ta fram formel) 2024
Observer-designmönstret låter flera observatörsobjekt meddelas när ett motivobjekt ändras på något sätt. Varje observatör registrerar sig med ämnet, och när en förändring uppstår, meddelar motivet dem alla. Var och en av observatörerna meddelas parallellt (det vill säga samtidigt).
Skapa ett ämnesgränssnitt
När du implementerar ett designmönster är det ofta en bra idé att börja skapa ett gränssnitt för att se till att de objekt du skapar kommer att följa det mönster du försöker använda - speciellt om flera objekt är inblandade. Genomförandet av det här gränssnittet - programmering till ett gränssnitt som det kallas - håller koden i linje och brukar hålla saker tydligare.
När du lägger Observer-mönstret i kod, ställer du in ett gränssnitt eller en abstrakt klass för observatörerna; du brukar ha flera observatörer, och du måste behålla de metoder som de implementerar konsekventa.
I det här exemplet måste du också skapa ett gränssnitt för ämnet, vilket är vad observatörerna tittar på. I ämnesgränssnittet anges de metoder som ämnena måste genomföra. Sätt ett registerObserver-metod här så att ämnet kan hålla reda på observatörer som vill bli registrerade. Förutom att registrera observatörer, borde du ha något sätt att bli av med dem, så lägg till en removeObserver-metod. Och det finns en notifyObservers-metod som meddelar observatörerna om någon förändring.
offentligt gränssnitt Ämne
{
offentligt tomt registerObserver (Observera o);
public void removeObserver (Observer o);
offentligt ogiltigt anmälerObservers ();
}
Detta gränssnitt listar de metoder som ämnen som databassystemet ska implementera. Nästa upp: gränssnittet för observatörerna.
Skapa ett observatörsgränssnitt
Bygga Observer-gränssnittet, som implementerats av observatörerna för att göra det möjligt för dem att få meddelanden, är enkelt. Allt du behöver är en metod som kommer att ringas när en ny anmälan är klar (du kan ringa den metoduppdateringen). I det här exemplet passerar du databasoperationen som utfördes (till exempel "redigera", "ta bort", "skapa" och så vidare) och posten som ändrades som strängar till uppdateringsmetoden.
offentligt gränssnittsobservatör
{
public void update (String operation, String record);
}
När observatörer implementerar uppdateringsmetoden kan ämnet vidarebefordra den post som har påverkats och den operation som utfördes.
Okej, du är bra att gå. Det är dags att skapa databasämnet som ska hålla reda på observatörerna och meddela dem när det har skett en förändring.
Skapa ett ämne
Ämnet måste låta observatörer registrera och måste meddela dem när en händelse inträffar. Enligt ämnesgränssnittet måste de tre metoder som ett ämne implementerar i dessa exempel vara: registerObserver, removeObserver och notifyObservers. Det är vad databasklassen gör i det här exemplet.
För att hålla koll på observatörerna, använd en Java-vektor som heter observatörer, skapad i databaskonstruktorn. (Typspecifikationen här är, för Java 1. 5 eller senare och indikerar att varje observerobjekt implementerar Observer-gränssnittet, om du använder en tidigare version av Java, släpp inte typspecifikationen.)
importera java. util. *;
Databaser för offentlig klass Ämne
{
privata vektorobservatörer;
offentlig databas ()
{
observatörer = ny vektor ();
}
.
.
.
}
När du använder en vektor är det enkelt att hålla reda på observatörer. När en observatör vill registrera, kallas det ämnets registerobservatormetod, som passerar sig som ett objekt. Ämnet - ett objekt i vår databasklass - behöver bara lägga till den observatören i observatörsvektorn i registretObserver-metoden, med hjälp av vektorklassens tilläggsmetod.
importera java. util. *;
Databaser för offentlig klass Ämne
{
privata vektorobservatörer;
offentlig databas ()
{
observatörer = ny vektor ();
}
public void registerObserver (Observer o)
{
observatörer. lägg (o);
}
.
.
.
}
Vad sägs om att ta bort en observatör från observatorns vektor? Inga problem. När du vill ta bort ett objekt från en vektor kan du använda vektorens borttagningsmetod. Så här fungerar det i databasklassens removeObserver-metod:
importera java. util. *;
Databaser för offentlig klass Ämne
{
privata vektorobservatörer;
offentlig databas ()
{
observatörer = ny vektor ();
}
public void registerObserver (Observer o)
{
observatörer. lägg (o);
}
public void removeObserver (Observer o)
{
observatörer. ta bort (o);
}
.
.
.
}
När användaren faktiskt gör någonting med databasen - raderar en post, till exempel - kallar han databasklassens redigeringsmetod. Om du till exempel vill radera post 1 kan du ringa den här metoden så här:
databasen. editRecord ("delete", "record 1");
Så här ser redigeringsmetoden ut: När den här metoden kallas, skickar du den databasoperation du vill utföra och den post som du vill arbeta på, både som strängar i det här exemplet. Dessa strängar lagras så att de kan vidarebefordras till observatörerna. När strängarna är lagrade, kallas notifyObservers-metoden, som kommer upp nästa, att meddela alla observatörer.
importera java. util. *;
Databaser för offentlig klass Ämne
{
privata vektorobservatörer;
privat strängoperation;
Private String Record;
offentlig databas ()
{
observatörer = ny vektor ();
}
.
.
.
public void editRecord (String operation, String record)
{
detta.operation = operation;
detta. spela in = spela in
notifyObservers ();
}
}
Här är köttet i koden, den del som meddelar varje observatör att det har skett en förändring: notifyObservers-metoden. Varje observatör implementerar det här exemplet Observer-gränssnittet - vilket innebär att det har en uppdateringsmetod - så anmälerObservers behöver bara slinga över alla registrerade observatörer i observatörsvektorn, som ringer upp varje uppdateringsmetod med databasoperationen och den drabbade posten.
importera java. util. *;
Databaser för offentlig klass Ämne
{
privata vektorobservatörer;
privat strängoperation;
Private String Record;
.
.
.
public void notifyObservers ()
{
för (int loopIndex = 0; loopIndex Observer observatör = (Observer) observatörer. få (loopIndex); observatör. uppdatering (operation, rekord); } } public void editRecord (String operation, String record) { detta. operation = operation; detta. spela in = spela in notifyObservers (); } } Det är allt du behöver för databas. Java, ämnet i det här exemplet. Ämnet låter observatörer registrera sig, avregistrera sig och bli informerad när en databasrekord har redigerats (som du gör med databasklassens redigeringsmetod). Allt som är kvar att göra för att få denna show på vägen är att skapa observatörerna själva.