Im vorherigen Artikel „Lassen Sie uns über den Memo-Modus in PHP sprechen“ haben wir den Memo-Modus in PHP vorgestellt. Dieser Artikel führt Sie zum Verständnis des Bridge-Modus im PHP-Entwurfsmuster.
Der Bridge-Modus ist in der Programmierwelt eigentlich gleichbedeutend mit Kombination/Aggregation. Warum sagst du das? Wir, die mit der Objektorientierung vertraut sind, kennen alle die Vorteile der Vererbung. Unterklassen können viele Attribute und Funktionen der übergeordneten Klasse teilen. Allerdings bringt die Vererbung auch ein Problem mit sich, nämlich eine ernsthafte Kopplung. Änderungen an der übergeordneten Klasse haben Auswirkungen auf die Unterklassen, und selbst eine Änderung einer Methode oder eines Attributs kann eine Änderung aller Unterklassen erfordern. Dies verstößt gegen das Prinzip der offenen Kapselung. Durch Bridging soll dieses Problem gelöst werden. Der Schwerpunkt liegt auf der Verwendung von Kombinationen/Aggregationen, um einige verfügbare Methoden gemeinsam zu nutzen. Ich glaube, Sie haben sicher über Eigenschaften in PHP nachgedacht. Wenn Sie diese Funktion bei der Arbeit verwendet haben, haben Sie bereits den Bridge-Modus verwendet!
GoF-Definition: Trennen Sie den abstrakten Teil von seinem Implementierungsteil, damit sie sich unabhängig voneinander ändern können.
GoF-Klassendiagramm
Code-Implementierung
interface Implementor { public function OperationImp(); } class ConcreteImplementorA implements Implementor { public function OperationImp() { echo '具体实现A', PHP_EOL; } } class ConcreteImplementorB implements Implementor { public function OperationImp() { echo '具体实现B', PHP_EOL; } }
Definieren wir zunächst die Implementierungsschnittstellen und ihre spezifischen Implementierungen, also die Funktionen, die wirklich ausgeführt werden müssen. Es ist wie Adaptee im Adaptermuster.
abstract class Abstraction { protected $imp; public function SetImplementor(Implementor $imp) { $this->imp = $imp; } abstract public function Operation(); } class RefinedAbstraction extends Abstraction { public function Operation() { $this->imp->OperationImp(); } }
Definieren Sie die Schnittstelle einer abstrakten Klasse und pflegen Sie einen Verweis auf die Implementierung. In der Implementierungsmethode einer bestimmten abstrakten Klasse rufen wir direkt die reale Operationsmethode auf, die die Schnittstelle implementiert. Ähnlich wie Adapter im Adapter.
$impA = new ConcreteImplementorA(); $impB = new ConcreteImplementorB(); $ra = new RefinedAbstraction(); $ra->SetImplementor($impA); $ra->Operation(); $ra->SetImplementor($impB); $ra->Operation();
Beim Aufruf durch den Client kann unsere abstrakte Klasse verschiedene Implementierungsklassen verwenden, um die Operationsmethode polymorph zu machen.
Vollständiger Code: https://github.com/zhangyue0503/designpatterns-php/blob/master/18.bridge/source/bridge.php
Beispiel
Vollständiger Quellcode: https://github.com/zhangyue0503/designpatterns-php/blob/master/18.bridge/source/bridge-message.php
<?php interface MessageTemplate { public function GetTemplate(); } class LoginMessage implements MessageTemplate { public function GetTemplate() { echo '您的登录验证码是【AAA】,请不要泄露给他人【XXX公司】!', PHP_EOL; } } class RegisterMessage implements MessageTemplate { public function GetTemplate() { echo '您的注册验证码是【BBB】,请不要泄露给他人【XXX公司】!', PHP_EOL; } } class FindPasswordMessage implements MessageTemplate { public function GetTemplate() { echo '您的找回密码验证码是【CCC】,请不要泄露给他人【XXX公司】!', PHP_EOL; } } abstract class MessageService { protected $template; public function SetTemplate($template) { $this->template = $template; } abstract public function Send(); } class AliYunService extends MessageService { public function Send() { echo '阿里云开始发送短信:'; $this->template->GetTemplate(); } } class JiGuangService extends MessageService { public function Send() { echo '极光开始发送短信:'; $this->template->GetTemplate(); } } // 三个短信模板 $loginTemplate = new LoginMessage(); $registerTemplate = new RegisterMessage(); $findPwTemplate = new FindPasswordMessage(); // 两个短信服务商 $aliYun = new AliYunService(); $jg = new JiGuangService(); // 随意组合 // 极光发注册短信 $jg->SetTemplate($registerTemplate); $jg->Send(); // 阿里云发登录短信 $aliYun->SetTemplate($loginTemplate); $aliYun->Send(); // 阿里云发找回密码短信 $aliYun->SetTemplate($findPwTemplate); $aliYun->Send(); // 极光发登录短信 $jg->SetTemplate($loginTemplate); $jg->Send(); // ......
Erläuterung
Dies ist ein Aggregationsmodus. Vorlagen sind nicht Teil des SMS-Versands. Sie haben keine starke Beziehung. Die Sendemethode des SMS-Absenders muss nicht geändert werden. Sie müssen lediglich verschiedene SMS-Vorlagen übergeben Um ein schnelles Senden verschiedener Vorlagen zu erreichen
Wenn Sie nicht sicher sind, ob es sich tatsächlich um eine Ist-Beziehung handelt, empfiehlt es sich, eine Kombinations-/Aggregationsentwurfsmethode wie den Bridge-Modus zu verwenden, wenn Sie sicher sind, dass die aktuelle Klassenbeziehung vorliegt ist is-a, dann zögern Sie nicht, Vererbung zu verwendenEmpfohlenes Lernen: „PHP-Video-Tutorial“
Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über den Bridge-Modus in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!