Heim >Backend-Entwicklung >PHP-Tutorial >PHP-objektorientiertes erweitertes Designmuster: Dekoratormuster
Was ist das Dekorationsmuster?
Wenn sich ein Teil oder die Funktionalität eines vorhandenen Objekts ändert, die Struktur des ursprünglichen Objekts jedoch nicht geändert werden muss, ist das Dekorator-Entwurfsmuster am besten geeignet.
Probleme und Lösungen bei der Anwendung von Dekorationsmustern:
Wenn wir zum ersten Mal etwas über objektorientierte Programmierung lernen, besteht das erste Hindernis oft darin, die Eltern-Kind-Beziehung in der Vererbungsbeziehung zu verstehen . Mit der Zeit werden wir mit dieser Programmiermethode vertrauter. Wenn erfahrene objektorientierte Programmierer vor einer neuen Herausforderung stehen, erweitern sie sofort die Funktionalität eines Objekts. Doch so wie alles einen Grad hat, kann nur eine mäßige Nutzung die gute Entwicklung dieser Art von Arbeit gewährleisten.
Die Codebasis sollte eine Begrenzung der Anzahl der Klassenhierarchien aufweisen. Wenn Objekte anfangen, zu viele Unterklassen zu erfordern, beeinträchtigt der entsprechende Code das Verständnis und die Wartbarkeit des Programmierers. Im Allgemeinen versuche ich sicherzustellen, dass es für ein Objekt nicht mehr als drei Eltern-Kind-Beziehungen gibt. Ich habe festgestellt, dass der Code verwirrend und unkontrollierbar wird, solange mehr Eltern-Kind-Beziehungen erstellt werden. Darüber hinaus kann die Verwendung von Normalpapier keine UML-Diagrammdarstellung eines Objekts in der Anwendung ermöglichen.
Allerdings möchte ich den Einsatz von Klassenerweiterungen nicht verhindern. Tatsächlich erweitern wir Objekte häufig mithilfe geeigneter Lösungen. Für einige Probleme ist jedoch die Verwendung von Klassen, die auf dem Dekorator-Entwurfsmuster basieren, eine bessere Lösung.
Das Decorator-Entwurfsmuster eignet sich für Situationen, in denen Programmierer viel Zeit verbringen: Änderungen sind schnell und klein und haben kaum Auswirkungen auf den Rest der Anwendung. Das Ziel beim Entwerfen einer Klasse mithilfe des Decorator-Entwurfsmusters besteht darin, inkrementelle Änderungen an einem Basisobjekt vorzunehmen, ohne vorhandene Funktionen überschreiben zu müssen. Dekoratoren sind so aufgebaut, dass es möglich sein sollte, einen oder mehrere Dekoratoren, die das Zielobjekt ändern oder „dekorieren“, direkt in den Hauptcodefluss einzufügen, ohne andere Codeflüsse zu beeinträchtigen.
UML
Das folgende UML-Diagramm beschreibt detailliert einen Klassenentwurf unter Verwendung des Decorator-Entwurfsmusters.
Die folgende Beschreibung des obigen Bildes:
1.MyObject ist eine Basisklasse mit vorhandener Funktionalität. Diese Klasse enthält ein öffentliches Array mit dem Namen „items“ und eine öffentliche Methode mit dem Namen „show ItemsFormatted()“.
2. Die Methode show ItemsFormatted() ist dafür verantwortlich, das Array „items“ zu akzeptieren, das Array mithilfe vordefinierter Funktionen zu formatieren und die Ausgabe zu senden.
3. Die MyObjectDecorator-Klasse enthält eine private Instanz von MyObject und zwei öffentliche Methoden: MyObjectDecorator() und decorItems().
4. Die Methode MyObjectDecorator() stellt den Konstruktor dar, der einen Parameter vom Typ MyObject akzeptiert und intern speichert.
5. Die Methode decorItems() kann das Items-Array der MyObject-Instanz ändern.
Schauen wir uns das folgende Beispiel an, um den Wert einer Fläche zu berechnen:
// 区域抽象类 abstract class Area { abstract public function treasure(); } //森林类,价值100 class Forest extends Area { public function treasure() { return 100; } } //沙漠类,价值10 class Desert extends Area { function function treasure() { return 10; } }
Der obige Code scheint kein Problem zu haben. aber wenn nötig Wie berechnet man den Wert eines zerstörten Waldes? Fügen Sie eine DamageForest-Unterklasse hinzu? Offensichtlich ist dies nicht machbar, da es wahrscheinlich viele andere Klassen mit überlappenden Typen gibt, was zu doppeltem Code in der Klasse und immer mehr Unterklassen führt.
Das Dekorationsmuster verwendet Komposition und Delegation anstelle von Vererbung, um die oben genannten Probleme zu lösen:
// 区域抽象类 abstract class Area { abstract public function treasure(); } //森林类,价值100 class Forest extends Area { public function treasure() { return 100; } } //沙漠类,价值10 class Desert extends Area { function function treasure() { return 10; } } //区域类的装饰器类 abstract class AreaDecorateor extends Area { protected $_area = null; public function __construct(Area $area) { $this->_area = $area; } } //被破坏了后的区域,价值只有之前的一半 class Damaged extends AreaDecorateor { public function treasure() { return $this->_area->treasure() * 0.5; } } //现在我们来获取被破坏的森林类的价值 $damageForest = new Damaged(new Forest()); echo $damageForest->treasure(); //返回50
Das obige ist der detaillierte Inhalt vonPHP-objektorientiertes erweitertes Designmuster: Dekoratormuster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!