Nu kom ik hier met nog een gedragsontwerppatroon in deze serie, het waarnemerspatroon. Observer betekent dat iemand naar je activiteit kijkt en het kan zijn dat de waarnemer wat actie onderneemt afhankelijk van je activiteit.
Hetzelfde concept is ook van toepassing op het ontwerppatroon. We zouden dit patroon moeten implementeren wanneer we een één-op-veel afhankelijkheid tussen ons object hebben en één object moet worden gewijzigd / aangemeld wanneer er wijzigingen worden aangebracht in een ander object.
Wikipedia zegt hetzelfde in de onderstaande woorden:
Het waarnemerspatroon is een softwareontwerppatroon waarin een object, het onderwerp genoemd, een lijst bijhoudt van zijn afhankelijken, waarnemers genoemd, en deze automatisch op de hoogte stelt van eventuele toestandsveranderingen, meestal door een van hun methoden aan te roepen. Het wordt voornamelijk gebruikt om gedistribueerde gebeurtenisafhandelingssystemen te implementeren. Het Observer-patroon is ook een belangrijk onderdeel van het vertrouwde model-view-controller (MVC) architecturale patroon.
Om meer over dit ontwerppatroon uit te leggen, neem ik het voorbeeld van een simulator die de waarde van verschillende valuta ten opzichte van de Amerikaanse dollar laat zien. We gaan ervan uit dat de simulator de prijs toont en de prijs ook regelmatig bijwerkt.
Voordat we beginnen, laten we de verantwoordelijkheden definiëren van de hoofdsimulatorklasse (die zich in dit voorbeeld gedraagt als de waarnemer).
In de volgende sectie zullen we onze waarnemer implementeren:
interface Observer public function addCurrency (Currency $ currency); class priceSimulator implementeert Observer private $ currency; publieke functie __construct () $ this-> valuta's = array (); public function addCurrency (Currency $ currency) array_push ($ this-> valuta's, $ valuta); public function updatePrice () foreach ($ this-> valuta's als $ valuta) $ valuta-> update ();
Als u naar de bovenstaande code kijkt, kunt u zien dat deze de mogelijkheid heeft om alle verantwoordelijkheden uit te voeren die we in het vorige gedeelte hebben genoemd.
Nu hebben we onze waarnemer paraat. Wat we nu nodig hebben, zijn een aantal verschillende valuta's die we aan deze waarnemer kunnen toevoegen en dan zijn we goed om te gaan. Laten we onze valutaklassen nu implementeren.
interface Valuta update openbare functie (); openbare functie getPrice (); klasse pond implementeert valuta private $ price; openbare functie __construct ($ prijs) $ dit-> prijs = $ prijs; echo "Pond Oorspronkelijke prijs: $ price
"; update openbare functie () $ this-> price = $ this-> getPrice (); echo"Pond Gewijzigde prijs: $ this-> price
"; public function getPrice () return f_rand (0.65, 0.71); klasse Yen implementeert Currency private $ price; public function __construct ($ price) $ this-> price = $ price; echo"Yen Oorspronkelijke prijs: $ price
"; update openbare functie () $ this-> price = $ this-> getPrice (); echo"Yen Bijgewerkt prijs: $ this-> prijs
"; openbare functie getPrice () return f_rand (120.52, 122.50);
We zijn er helemaal klaar voor om alles samen te stellen en onze waarnemer te leiden.
interface Observer public function addCurrency (Currency $ currency); class priceSimulator implementeert Observer private $ currency; publieke functie __construct () $ this-> valuta's = array (); public function addCurrency (Currency $ currency) array_push ($ this-> valuta's, $ valuta); public function updatePrice () foreach ($ this-> valuta's als $ valuta) $ valuta-> update (); interface Currency public function update (); openbare functie getPrice (); klasse pond implementeert valuta private $ price; openbare functie __construct ($ prijs) $ dit-> prijs = $ prijs; echo "Pond Oorspronkelijke prijs: $ price
"; update openbare functie () $ this-> price = $ this-> getPrice (); echo"Pond Gewijzigde prijs: $ this-> price
"; public function getPrice () return f_rand (0.65, 0.71); klasse Yen implementeert Currency private $ price; public function __construct ($ price) $ this-> price = $ price; echo"Yen Oorspronkelijke prijs: $ price
"; update openbare functie () $ this-> price = $ this-> getPrice (); echo"Yen Bijgewerkt prijs: $ this-> prijs
"; openbare functie getPrice () return f_rand (120.52, 122.50); functie f_rand ($ min = 0, $ max = 1, $ mul = 1000000) if ($ min> $ max) retourneer false; retourneer mt_rand ($ min * $ mul, $ max * $ mul) / $ mul; $ priceSimulator = nieuwe priceSimulator (); $ currency1 = new Pound (0.60); $ currency2 = new Yen (122); $ priceSimulator-> addCurrency ($ valuta1); $ priceSimulator-> addCurrency ($ currency2); echo "
"; $ priceSimulator-> updatePrice (); echo"
"; $ priceSimulator-> updatePrice ();
De bovenstaande code zal uitvoeren:
Pound Oorspronkelijke prijs: 0.6 Yen Oorspronkelijke prijs: 122 ------------- Pond bijgewerkt Prijs: 0.65346 Yen Prijs bijgewerkt: 121.287809 ------------- Pond bijgewerkt Prijs: 0.671269 Yen Bijgewerkt Prijs: 121.300605
Hier kunt u zien dat we de prijzen voor alle geregistreerde valuta's hebben bijgewerkt en deze worden weergegeven in onze simulator. Nu zullen we bekijken hoe we nieuwe valuta's aan deze simulator kunnen toevoegen met slechts een kleine wijziging.
Deze aanpassing omvat alleen het registreren van valuta's in de simulator. Als zodanig blijft onze klantcode onaangetast wanneer deze de prijsupdater in onze simulator aanroept.
Een nieuwe valuta toevoegen
klasse Euro implementeert Valuta private $ price; openbare functie __construct ($ prijs) $ dit-> prijs = $ prijs; echo "Oorspronkelijke prijs euro: $ price
"; update openbare functie () $ this-> price = $ this-> getPrice (); echo"Euro Gewijzigde prijs: $ this-> price
"; openbare functie getPrice () return f_rand (0.78, 0.85);
Het was gemakkelijk en eenvoudig om een nieuwe valuta toe te voegen. Nu hoeven we alleen maar deze nieuwe valuta bij onze waarnemer te registreren en we zijn er helemaal klaar mee!
$ priceSimulator = new priceSimulator (); $ currency1 = new Pound (0,60); $ currency2 = nieuwe yen (122); $ valuta3 = nieuwe euro (122); $ PriceSimulator-> addCurrency ($ valuta1); $ PriceSimulator-> addCurrency ($ valuta2); $ PriceSimulator-> addCurrency ($ currency3); echo "
"; $ priceSimulator-> updatePrice (); echo"
"; $ priceSimulator-> updatePrice ();
De status van elk object is erg belangrijk bij Objectgeoriënteerd programmeren, omdat alles loopt tussen objecten en hun interactie met elkaar. Het is vaak het geval dat een paar objecten moeten worden gewaarschuwd wanneer wijzigingen optreden in andere objecten. Het waarnemingspatroon van de waarnemer kan worden gebruikt wanneer veranderingen in een onderwerp door een of meer waarnemers moeten worden waargenomen.
Vergeet niet om uw feedback hieronder te laten.