Heim >Backend-Entwicklung >PHP-Tutorial >PHP Master | Verwalten Sie die Komplexität mit dem Fassadenmuster
<span><span><?php </span></span><span><span>public class User </span></span><span><span>{ </span></span><span> <span>public function borrowBook() { </span></span><span> <span>$bookManager = new Book_Manager(); </span></span><span> <span>$bookManager->returnBooks(); </span></span><span> </span><span> <span>$bookPayments = new Book_Payments(); </span></span><span> <span>if ($bookPayments->hasOverdueBooks()) { </span></span><span> <span>$bookPayments->payBookFines(); </span></span><span> <span>} </span></span><span> </span><span> <span>$bookLibrary = new Book_Library(); </span></span><span> <span>$bookReservations = new Book_Reservations(); </span></span><span> </span><span> <span>$book = $bookLibrary->searchBooks(); </span></span><span> <span>$isAvailable = $bookLibrary->isBookAvailable($book); </span></span><span> <span>$isReserved = $bookReservations->isBookReserved($book); </span></span><span> <span>if ($isAvailable && !isReserved) { </span></span><span> <span>$bookLibrary->locateBook($book); </span></span><span> </span><span> <span>$bookManager->borrowBook($book); </span></span><span> <span>$bookLibrary->updateBookAvailability($book, $status); </span></span><span> <span>} </span></span><span> <span>} </span></span><span><span>}</span></span>Sie können sehen, dass der Prozess des Ausleihens eines Buches tatsächlich ein komplexer Prozess ist! In dieser Implementierung muss ein Benutzer mit vier verschiedenen Klassen und rund zehn Methoden interagieren, um ein Buch auszuleihen. Angenommen, jedes Bit der Funktionalität wird als separater Bildschirm in der Anwendung implementiert. Können Sie sich die Anstrengungen vorstellen, die für das Ausleihen von drei Büchern mit diesem System erforderlich sind? Der Kreditnehmer muss nicht über Funktionen wie das Überprüfen von Reservierungen und die Aktualisierung des Status wissen. Wir haben sicherlich ein Problem mit unserer Implementierung.
<span><span><?php </span></span><span><span>class Library_Facade </span></span><span><span>{ </span></span><span> <span>public function returnBooks() { </span></span><span> <span>// previous implementation by calling necessary classes </span></span><span> <span>} </span></span><span> </span><span> <span>public function borrowBooks() { </span></span><span> <span>} </span></span><span> </span><span> <span>public function searchBooks() { </span></span><span> <span>} </span></span><span> </span><span> <span>public function reserveBooks() { </span></span><span> <span>} </span></span><span><span>}</span></span>Der Benutzer kann Bücher ausleihen, indem er die Methode blouorbook () der bibliotheks_facade -Klasse anruft, wie im folgenden Beispiel gezeigt:
<span><span><?php </span></span><span><span>class User </span></span><span><span>{ </span></span><span> <span>public function borrowBook() { </span></span><span> <span>$libraryFacade = new Library_Facade(); </span></span><span> <span>$libraryFacade->borrowBook(); </span></span><span> <span>} </span></span><span><span>}</span></span>Mit dieser fassadenbasierten Implementierung spricht der Benutzer nur mit der Klasse Library_Facade und hat keine Ahnung, wie die Funktionalität darüber hinaus implementiert wird. Ein Benutzer kann jede Funktion von der Fassade direkt anfordern, und die Fassade ist für die Behandlung des komplexen Prozesses und die Rückgabe der entsprechenden Informationen verantwortlich. Das Fassadenmuster hält sich an das Prinzip des geringsten Wissens, in dem jede Einheit nur über die anderen Einheiten über minimale Kenntnisse verfügen sollte. Obwohl die Funktionalität auf niedriger Ebene vor der Fassade vor dem Benutzer verborgen ist, kann der Benutzer bei Bedarf direkt Klassen auf niedrigem Niveau anfordern. Denken Sie an Ihre eigenen Projekte und in denen Sie möglicherweise Situationen finden, in denen Sie das Fassadenmuster implementiert haben, ohne es zu merken.
Eine Fassade ist ein Objekt, das eine vereinfachte Schnittstelle zu einem größeren Code wie einer Klassenbibliothek bietet. Eine Fassade kann:Hier ist ein Klassendiagramm unseres Bibliotheksbeispiels, das die in der Definition der Fassadenmuster genannten Komponenten identifiziert.
- Erstellen Sie eine Software -Bibliothek leichter zu verwenden, zu verstehen und zu testen, da die Fassade bequeme Methoden für gemeinsame Aufgaben hat.
- Machen Sie die Bibliothek aus dem gleichen Grund lesbarer;
- Reduzieren Sie die Abhängigkeiten von externen Code vom Innenleben einer Bibliothek, da die meisten Code die Fassade verwenden, was mehr Flexibilität bei der Entwicklung eines Systems ermöglicht.
- Wickeln Sie eine schlecht gestaltete Sammlung von APIs mit einer einzigen gut gestalteten API.
<span><span><?php </span></span><span><span>public class User </span></span><span><span>{ </span></span><span> <span>public function borrowBook() { </span></span><span> <span>$bookManager = new Book_Manager(); </span></span><span> <span>$bookManager->returnBooks(); </span></span><span> </span><span> <span>$bookPayments = new Book_Payments(); </span></span><span> <span>if ($bookPayments->hasOverdueBooks()) { </span></span><span> <span>$bookPayments->payBookFines(); </span></span><span> <span>} </span></span><span> </span><span> <span>$bookLibrary = new Book_Library(); </span></span><span> <span>$bookReservations = new Book_Reservations(); </span></span><span> </span><span> <span>$book = $bookLibrary->searchBooks(); </span></span><span> <span>$isAvailable = $bookLibrary->isBookAvailable($book); </span></span><span> <span>$isReserved = $bookReservations->isBookReserved($book); </span></span><span> <span>if ($isAvailable && !isReserved) { </span></span><span> <span>$bookLibrary->locateBook($book); </span></span><span> </span><span> <span>$bookManager->borrowBook($book); </span></span><span> <span>$bookLibrary->updateBookAvailability($book, $status); </span></span><span> <span>} </span></span><span> <span>} </span></span><span><span>}</span></span>Wie Sie sehen können, nennen wir eine Reihe von Twitter-spezifischen Bibliotheksmethoden, um die gewünschte Funktionalität zu implementieren. Ein ähnlicher Ansatz wäre sowohl für LinkedIn als auch für Facebook erforderlich. Der Prozess ist bereits komplex geworden. Wir entwickeln keine Twitter-, Facebook- oder LinkedIn -Anwendung. Wir sollten nur die Anmeldeinformationen validieren und den Benutzer authentifizieren. Unsere Bewerbung sollte sich nicht über die Umsetzung jeder dieser Dienste Sorgen machen. Wir können dieses Problem lösen, indem wir die Opauth -Bibliothek als Fassadenschnittstelle verwenden. Zunächst müssen wir die Anmelde -URLs der gewünschten Dienste in einem gemeinsamen Format angeben, das vom OPAuth -Plugin identifiziert wird. Betrachten Sie den folgenden Code für die Implementierung des Authentifizierungsprozesses.
<span><span><?php </span></span><span><span>class Library_Facade </span></span><span><span>{ </span></span><span> <span>public function returnBooks() { </span></span><span> <span>// previous implementation by calling necessary classes </span></span><span> <span>} </span></span><span> </span><span> <span>public function borrowBooks() { </span></span><span> <span>} </span></span><span> </span><span> <span>public function searchBooks() { </span></span><span> <span>} </span></span><span> </span><span> <span>public function reserveBooks() { </span></span><span> <span>} </span></span><span><span>}</span></span>Sobald der Anmeldelink angefordert wurde, identifiziert OpAuth den angeforderten Dienst aus der URL und initialisiert die Bibliothek, um den Benutzer zur Authentifizierung umzuleiten. Unsere Anwendung muss nun nur die Anmeldeverbindungen erstellen und die Initialisierungsmethode aufrufen. Alle komplexen Authentifizierungsmaterial werden hinter den Kulissen mit den jeweiligen Bibliotheken für jeden Dienst gehandhabt. Dies kann als perfektes Beispiel für die effektive Verwendung des Fassadenmusters angesehen werden.
<span><span><?php </span></span><span><span>public class User </span></span><span><span>{ </span></span><span> <span>public function borrowBook() { </span></span><span> <span>$bookManager = new Book_Manager(); </span></span><span> <span>$bookManager->returnBooks(); </span></span><span> </span><span> <span>$bookPayments = new Book_Payments(); </span></span><span> <span>if ($bookPayments->hasOverdueBooks()) { </span></span><span> <span>$bookPayments->payBookFines(); </span></span><span> <span>} </span></span><span> </span><span> <span>$bookLibrary = new Book_Library(); </span></span><span> <span>$bookReservations = new Book_Reservations(); </span></span><span> </span><span> <span>$book = $bookLibrary->searchBooks(); </span></span><span> <span>$isAvailable = $bookLibrary->isBookAvailable($book); </span></span><span> <span>$isReserved = $bookReservations->isBookReserved($book); </span></span><span> <span>if ($isAvailable && !isReserved) { </span></span><span> <span>$bookLibrary->locateBook($book); </span></span><span> </span><span> <span>$bookManager->borrowBook($book); </span></span><span> <span>$bookLibrary->updateBookAvailability($book, $status); </span></span><span> <span>} </span></span><span> <span>} </span></span><span><span>}</span></span>Es wird nur der notwendige Code angezeigt; Der vollständige Quellcode für die Funktion update_metadata () ist in der meta.php-Datei im Verzeichnis wp-includes verfügbar. Sie können jedoch alle Validierungs-, Filter- und Datenbankaktualisierungen hier implementieren, und nur die Fassadeschnittstelle verfügt über Kenntnisse über die Details.
Wie wirkt sich das Fassadenmuster auf die Leistung aus? Der Kunde muss interagieren. Dies kann den Overhead von Objekterstellung und Methodenaufruf verringern. Wenn die Fassade jedoch zum Engpass wird, kann sie die Leistung negativ auf die Leistung auswirken. Fassadenklasse, die eine vereinfachte Schnittstelle zum komplexen Subsystem bietet. Die Fassadenklasse sollte das Subsystem und die Delegierten -Aufrufe in die Subsystemklassen zusammenfassen. Der Kunde sollte durch die Fassade mit dem Subsystem interagieren, nicht direkt mit den Subsystemklassen.
Das obige ist der detaillierte Inhalt vonPHP Master | Verwalten Sie die Komplexität mit dem Fassadenmuster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!