Anpassbares Besuchermuster

巴扎黑
Freigeben: 2016-11-12 13:39:43
Original
1109 Leute haben es durchsucht

Eines Tages sagte der technische Leiter, er wolle den Arbeitsstatus aller technischen Mitarbeiter wissen. Am nächsten Tag sagte der Chef, er wolle die Leistung aller Mitarbeiter wissen aller Mitarbeiter. Jedes Mal wird der Kombinationsmodus verwendet, um die Mitarbeiter zu durchqueren und die relevanten Informationen der Mitarbeiter zu erhalten. Vielleicht werden Sie sagen, dass Sie einfach alle Informationen ausgeben können. Dann werden Sie wahrscheinlich vom Chef erwischt. Wenn Sie sich einen großen Tisch ansehen, können Sie nach Hause gehen. Lassen Sie uns das Besuchermuster bei der Lösung dieses Problems unterstützen. Das Klassendiagramm lautet wie folgt:


Wie Sie sehen können, gibt es einen Besucher, der der Besucher ist, und es scheint ein bisschen wie ein Agent. Wenn wir über den Proxy-Modus sprechen, haben wir bereits den Besuchermodus erwähnt. Bei diesem Kauf wird der Proxy-Modus für besondere Anlässe verwendet. Implementierungscode:

<?php
interface IVisitor{
public function visitCommonEmployee( CommonEmployee $commonEmployee );
public function visitManager( Manager $manager );
}
class Visitor implements IVisitor{
public function visitCommonEmployee( CommonEmployee $commonEmployee ) {
echo $this->getCommonEmployee( $commonEmployee );
}
public function visitManager( Manager $manager ) {
echo $this->getManagerInfo( $manager );
}
private function getBasicInfo( Employee $employee ) {
$info = "姓名:".$employee->getName()."\t";
return $info;
}
private function getCommonEmployee( CommonEmployee $commonEmployee ) {
$basicInfo = $this->getBasicInfo( $commonEmployee );
$otherInfo = "工作:".$commonEmployee->getJob()."\n";
return $basicInfo.$otherInfo;
}
private function getManagerInfo( Manager $manager ) {
$basicInfo = $this->getBasicInfo( $manager );
$otherInfo = "业绩:".$manager->getPerformance()."\n";
return $basicInfo.$otherInfo;
}
}
abstract class Employee {
private $name;
public function getName() {
return $this->name;
}
public function setName( $name ) {
$this->name = $name;
}
public function accept( IVisitor $visitor ) {
$method = &#39;visit&#39;.get_class( $this );
$visitor->$method( $this );
}
}
class CommonEmployee extends Employee{
private $job;
public function getJob() {
return $this->job;
}
public function setJob( $job ) {
$this->job = $job;
}
}
class Manager extends Employee{
private $performance;
public function getPerformance() {
return $this->performance;
}
public function setPerformance( $performance ) {
$this->performance = $performance;
}
}
$empList = array();
$zhangsan = new CommonEmployee();
$zhangsan->setName( &#39;张三&#39; );
$zhangsan->setJob( &#39;coding&#39; );
$empList[] = $zhangsan;
$lisi = new CommonEmployee();
$lisi->setName( &#39;李四&#39; );
$lisi->setJob( &#39;coding&#39; );
$empList[] = $lisi;
$wangwu = new Manager();
$wangwu->setName( &#39;马云&#39; );
$wangwu->setPerformance( &#39;负值,但拍马屁厉害&#39; );
$empList[] = $wangwu;
foreach ($empList as $value) {
$value->accept(new Visitor());
}
?>
Nach dem Login kopieren

Laufergebnis:

Name: Zhang San Arbeit: Codierung

Name: Li Si Arbeit: Codierung

Name: Jack Ma-Leistung: Negativ, aber sehr schmeichelhaft

[Fertig in 0,4 Sekunden]

Wenn es in Zukunft eine spezielle Liste gibt, muss ich nur einen speziellen Besucher hinzufügen. Jetzt kann der Chef nicht beschimpfe mich!

Die Definition des Besuchermusters

kapselt einige Operationen, die auf jedes Element in einer bestimmten Datenstruktur wirken. Es kann neue Operationen definieren, die auf diese Elemente wirken, ohne die Datenstruktur zu ändern. Die Hauptrollen sind:

1. VIsitor – abstrakter Besucher

Abstrakte Klassenschnittstelle, die deklariert, auf welche Elemente der Besucher zugreifen kann. Spezifisch für das Programm definieren die Parameter der Visit-Methode, welche Objekte kann besichtigt werden.

2. Konkreter Besucher – Konkreter Besucher

Es beeinflusst, was der Besucher nach dem Zugriff auf eine Klasse tun soll.

3. Element – ​​Abstraktes Element

Schnittstelle oder abstrakte Klasse deklariert, welcher Besuchertyp akzeptiert wird. Programmgesteuert wird es durch die Parameter in der Accept-Methode definiert.

4. ConcreteElement – ​​spezifisches Element

implementiert die Accept-Methode, normalerweise Visitors->visitor($this), die im Grunde ein Muster bildet.

5. ObjectStruture – Strukturobjekt-

-Elementgenerator, der im Allgemeinen mehrere Container verschiedener Klassen und Schnittstellen unterstützt.

Vorteile des Besuchermusters

1. Beachten Sie das Prinzip der Einzelverantwortung

Die spezifischen Elementrollen sind zwei Unterklassen der abstrakten Mitarbeiterklasse verantwortlich für das Laden der Daten, während die Besucherklasse für die Anzeige des Berichts verantwortlich ist. Die beiden unterschiedlichen Verantwortlichkeiten sind sehr klar getrennt und führen jeweils Änderungen durch.

2. Hervorragende Skalierbarkeit

Aufgrund der Aufgabentrennung ist es sehr schnell möglich, den Datenbetrieb weiter zu steigern, wenn Sie beispielsweise einen Bericht für den großen Chef hinzufügen möchten Fügen Sie eine direkt in der Besuchermethode hinzu. Nach der Übergabe der Daten werden diese sortiert und gedruckt.

3. Sehr hohe Flexibilität

Angenommen, Sie müssen gleichzeitig mit dem Bericht das Gesamtgehalt berechnen

Nachteile des Besuchermodus

1. Spezifische Elemente Details für Besucher veröffentlichen

Wenn ein Besucher auf eine Klasse zugreifen möchte, muss die Klasse einige Methoden und Daten veröffentlichen. Mit anderen Worten, der Besucher achtet auf die internen Details anderer Klassen. Das ist nicht die Regel von Demeter.

2. Es ist schwierig, bestimmte Elemente zu ändern.

Es ist schwierig, bestimmte Elementrollen hinzuzufügen, zu löschen und zu ändern. Wenn Sie im obigen Beispiel eine Mitgliedsvariable hinzufügen möchten, z Als Alter muss der Besucher geändert werden. Wenn es mehr als einen Besucher gibt, muss jeder einzelne geändert werden.

3. Verstößt gegen das Abhängigkeitsinversionsprinzip

Besucher verlassen sich auf konkrete Elemente statt auf abstrakte Elemente, was insbesondere bei der objektorientierten Programmierung gegen das Abhängigkeitsinversionsprinzip verstößt und die Abhängigkeit von Schnittstellen aufgibt Es ist schwieriger, sich direkt auf Implementierungsklassen und Erweiterungen zu verlassen.

Verwendungsszenarien des Besuchermusters

1. Eine Objektstruktur enthält viele Klassenobjekte, sie haben unterschiedliche Schnittstellen und Sie möchten einige Operationen an diesen Objekten ausführen, die von ihren spezifischen Klassen abhängen Mit anderen Worten, das Iteratormuster ist nicht mehr ausreichend.

2. An den Objekten in einer Objektstruktur müssen viele verschiedene und voneinander unabhängige Operationen ausgeführt werden, und Sie möchten vermeiden, dass diese Operationen die Klassen dieser Objekte „verunreinigen“

Erweiterung des Besuchermodus

1. Statistikfunktion

Wenn Sie beispielsweise die Löhne aller Mitarbeiter zählen möchten, müssen Sie nur eine Methode zur Schnittstelle hinzufügen und diese implementieren in einer bestimmten Klasse.

2. Mehrere Besucher

Wie ich bereits sagte: Wenn verschiedene Besucher unterschiedliche Berichtsanforderungen haben, fügen Sie einfach direkt eine Besucherklassenimplementierung hinzu.

3. Dualer Versand (JAVA)

Nörgeln: Der Besuchermodus ist ein zentralisierter Regularisierungsmodus, der sich besonders für groß angelegte Refaktorisierungen eignet Sehr klar, und die Funktionspunkte des ursprünglichen Systems wurden ebenfalls geklärt. Durch den Besuchermodus können einige Funktionen leicht sortiert werden, um das ultimative Ziel zu erreichen – Funktionszentralisierung, wie eine einheitliche Berichtsberechnung, UI-Anzeige usw. und kann auch mit anderen Mustermischungen kombiniert werden, um Ihren eigenen Satz von Filtern oder Abfangjägern zu erstellen.


Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage