Im vorherigen Artikel „Was ist das Zustandsmuster in PHP? Lernen Sie es anhand von Beispielen " Wir haben das Zustandsmuster in PHP eingeführt. Der folgende Artikel führt Sie dazu, das Besuchermuster in PHP-Entwurfsmustern zu verstehen.
Besucher, genau wie wenn wir die Häuser anderer Menschen besuchen oder wenn andere zu uns nach Hause kommen, um uns zu besuchen. Jeder von uns ist wie eine Einheit, und jeder, der uns besucht, begrüßt uns einzeln. Schließlich ist unsere chinesische Nation eine Nation, die großen Wert auf Etikette und Gastfreundschaft legt. Visitor ist das komplexeste Muster unter den 23 Designmustern von GoF und es ist auch das Muster, das in verschiedenen Designmuster-Lehrbüchern an letzter Stelle steht. Unabhängig von der Schwierigkeit schauen wir uns zunächst die Definition und Implementierung an.
GoF-Definition: Stellt eine Operation dar, die auf jedes Element in einer Objektstruktur wirkt. Sie können damit neue Operationen definieren, die auf diese Elemente einwirken, ohne deren Klassen zu ändern. Es kann als ein junges Paar betrachtet werden, das unser Haus besucht! interface Visitor
{
public function VisitConcreteElementA(ConcreteElementA $a);
function VisitConcreteElementB(ConcreteElementB $b);
}
class ConcreteVisitor1 implements Visitor
{
public function VisitConcreteElementA(ConcreteElementA $a)
{
echo get_class($a) . "被" . get_class($this) . "访问", PHP_EOL;
}
public function VisitConcreteElementB(ConcreteElementB $b)
{
echo get_class($b) . "被" . get_class($this) . "访问", PHP_EOL;
}
}
class ConcreteVisitor2 implements Visitor
{
public function VisitConcreteElementA(ConcreteElementA $a)
{
echo get_class($a) . "被" . get_class($this) . "访问", PHP_EOL;
}
public function VisitConcreteElementB(ConcreteElementB $b)
{
echo get_class($b) . "被" . get_class($this) . "访问", PHP_EOL;
}
}
interface Element { public function Accept(Visitor $v); } class ConcreteElementA implements Element { public function Accept(Visitor $v) { $v->VisitConcreteElementA($this); } public function OperationA() { } } class ConcreteElementB implements Element { public function Accept(Visitor $v) { $v->VisitConcreteElementB($this); } public function OperationB() { } }
Dies ist eine Objektstruktur, die zum Speichern von Elemententitäten und zum Durchführen von Zugriffsaufrufen verwendet wird. Alle trafen sich im Wohnzimmer und tauschten Grüße aus. Das ist nur ein Wohnzimmerclass ObjectStructure
{
private $elements = [];
public function Attach(Element $element)
{
$this->elements[] = $element;
}
public function Detach(Element $element)
{
$position = 0;
foreach ($this->elements as $e) {
if ($e == $element) {
unset($this->elements[$position]);
break;
}
$position++;
}
}
public function Accept(Visitor $visitor)
{
foreach ($this->elements as $e) {
$e->Accept($visitor);
}
}
}
Lassen Sie Besucher das angegebene Element aufrufen. Hierbei ist zu beachten, dass das Verhalten der Besucher beim Aufrufen von Elementen grundsätzlich festgelegt ist und sich selten ändert. Das heißt, die beiden Methoden VisitConcreteElementA() und VisitConcreteElementB(). Das heißt, die Klasse, die die Objektstruktur definiert, ändert sich selten. Wenn jedoch häufig neue Operationen für diese Struktur definiert werden müssen, wird das Besuchermuster verwendet eine Objektstruktur, und wenn Sie vermeiden möchten, dass diese Operationen die Klassen dieser Objekte „verschmutzen“, ist das Besuchermuster geeignet. Das Besuchermuster eignet sich für Situationen, in denen sich die Datenstruktur nicht ändert. Daher ist es ein Modus, den Sie nicht normal verwenden können, sondern nur bei Bedarf. GoF: „Meistens braucht man den Besuchermodus nicht, aber wenn, dann braucht man ihn wirklich.“ Da es nur wenige Situationen gibt, in denen sich die Datenstruktur nicht ändert, gibt es einige Vor- und Nachteile des Besuchermusters: Es ist einfach, neue Operationen hinzuzufügen und irrelevante Operationen zu trennen. Es ist schwierig, neue ConcreteElement-Klassen hinzuzufügen ; Kumulierter Status; Zerstörung der Kapselung
Die Konten unseres Unternehmens enthalten nur zwei Posten (Elemente): Einnahmen und Ausgaben, aber verschiedene Abteilungen (Besucher) geben beim Zugriff unterschiedliche Inhalte an. Wenn ich beispielsweise nachschaue, muss ich nur die monatlichen oder vierteljährlichen Übersichtsdaten überprüfen. Der Finanzdirektor benötigt detaillierte Einnahmen- und Ausgabenaufzeichnungen, und der Buchhalter benötigt bei der Buchhaltung vollständige Angaben. Es ist ersichtlich, dass der Betrieb des Unternehmens wirklich ein sehr breites Wissensspektrum erfordert, nicht nur Managementfähigkeiten, sondern auch Buchhaltungskenntnisse sind ein Muss! !
Vollständiger Code: https://github.com/zhangyue0503/designpatterns-php/blob/master/23.visitor/source/visitor.php
Beispiel
Vollständiger Quellcode: https://github.com/zhangyue0503/designpatterns-php/blob/master/23.visitor/source/visitor-msg.php
$o = new ObjectStructure(); $o->Attach(new ConcreteElementA()); $o->Attach(new ConcreteElementB()); $v1 = new ConcreteVisitor1(); $v2 = new ConcreteVisitor2(); $o->Accept($v1); $o->Accept($v2);
Erklärung
Originaladresse: https://juejin.cn/post/6844903993240453133
Autor: Hardcore Project ManagerEmpfohlenes Lernen : „PHP-Video-Tutorial“》
Das obige ist der detaillierte Inhalt vonEine eingehende Analyse des Besuchermusters in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!