Heim Backend-Entwicklung PHP-Tutorial Anpassbares Besuchermuster

Anpassbares Besuchermuster

Nov 12, 2016 pm 01:39 PM

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.


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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Repo: Wie man Teamkollegen wiederbelebt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Arbeiten mit Flash -Sitzungsdaten in Laravel Arbeiten mit Flash -Sitzungsdaten in Laravel Mar 12, 2025 pm 05:08 PM

Laravel vereinfacht die Behandlung von temporären Sitzungsdaten mithilfe seiner intuitiven Flash -Methoden. Dies ist perfekt zum Anzeigen von kurzen Nachrichten, Warnungen oder Benachrichtigungen in Ihrer Anwendung. Die Daten bestehen nur für die nachfolgende Anfrage standardmäßig: $ Anfrage-

Curl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIs Curl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIs Mar 14, 2025 am 11:42 AM

Die PHP Client -URL -Erweiterung (CURL) ist ein leistungsstarkes Tool für Entwickler, das eine nahtlose Interaktion mit Remote -Servern und REST -APIs ermöglicht. Durch die Nutzung von Libcurl, einer angesehenen Bibliothek mit Multi-Protokoll-Dateien, erleichtert PHP Curl effiziente Execu

Erstellen Sie eine React -App mit einem Laravel -Back -Ende: Teil 2, reagieren Erstellen Sie eine React -App mit einem Laravel -Back -Ende: Teil 2, reagieren Mar 04, 2025 am 09:33 AM

Dies ist der zweite und letzte Teil der Serie zum Aufbau einer Reaktionsanwendung mit einem Laravel-Back-End. Im ersten Teil der Serie haben wir eine erholsame API erstellt, die Laravel für eine grundlegende Produktlistenanwendung unter Verwendung von Laravel erstellt hat. In diesem Tutorial werden wir Dev sein

Vereinfachte HTTP -Reaktion verspottet in Laravel -Tests Vereinfachte HTTP -Reaktion verspottet in Laravel -Tests Mar 12, 2025 pm 05:09 PM

Laravel bietet eine kurze HTTP -Antwortsimulationssyntax und vereinfache HTTP -Interaktionstests. Dieser Ansatz reduziert die Code -Redundanz erheblich, während Ihre Testsimulation intuitiver wird. Die grundlegende Implementierung bietet eine Vielzahl von Verknüpfungen zum Antworttyp: Verwenden Sie Illuminate \ Support \ facades \ http; Http :: fake ([ 'Google.com' => 'Hallo Welt',, 'github.com' => ['foo' => 'bar'], 'Forge.laravel.com' =>

12 Beste PHP -Chat -Skripte auf Codecanyon 12 Beste PHP -Chat -Skripte auf Codecanyon Mar 13, 2025 pm 12:08 PM

Möchten Sie den dringlichsten Problemen Ihrer Kunden in Echtzeit und Sofortlösungen anbieten? Mit Live-Chat können Sie Echtzeitgespräche mit Kunden führen und ihre Probleme sofort lösen. Sie ermöglichen es Ihnen, Ihrem Brauch einen schnelleren Service zu bieten

Benachrichtigungen in Laravel Benachrichtigungen in Laravel Mar 04, 2025 am 09:22 AM

In diesem Artikel werden wir das Benachrichtigungssystem im Laravel -Web -Framework untersuchen. Mit dem Benachrichtigungssystem in Laravel können Sie Benachrichtigungen an Benutzer über verschiedene Kanäle senden. Heute werden wir diskutieren, wie Sie Benachrichtigungen OV senden können

Erklären Sie das Konzept der späten statischen Bindung in PHP. Erklären Sie das Konzept der späten statischen Bindung in PHP. Mar 21, 2025 pm 01:33 PM

In Artikel wird die in PHP 5.3 eingeführte LSB -Bindung (LSB) erörtert, die die Laufzeitauflösung der statischen Methode ermöglicht, um eine flexiblere Vererbung zu erfordern. Die praktischen Anwendungen und potenziellen Perfo von LSB

PHP -Protokollierung: Best Practices für die PHP -Protokollanalyse PHP -Protokollierung: Best Practices für die PHP -Protokollanalyse Mar 10, 2025 pm 02:32 PM

Die PHP -Protokollierung ist für die Überwachung und Debugie von Webanwendungen von wesentlicher Bedeutung sowie für das Erfassen kritischer Ereignisse, Fehler und Laufzeitverhalten. Es bietet wertvolle Einblicke in die Systemleistung, hilft bei der Identifizierung von Problemen und unterstützt eine schnellere Fehlerbehebung

See all articles