一、橋梁模式結構圖
二、橋梁模式中主要角色
抽象化(Abstraction)角色:定義抽象類的接口並保存一個對實現化對象的引用。
修正抽象化(Refined Abstraction)角色:擴展抽象化角色,改變和修正父類對抽象化的定義。
實現化(Implementor)角色:定義實現類的接口,不給出具體的實現。此接口不一定和抽象化角色的接口定義相同,實際上,這兩個接口可以完全不同。實現化角色應當只給出底層操作,而抽象化角色應當只給出基於底層操作的更高一層的操作。
具體實現化(Concrete Implementor)角色:實現實現化角色接口並定義它的具體實現。
三、橋梁模式的優點
1、分離接口及其實現部分
將Abstraction與Implementor分享有助於降低對實現部分編譯時刻的依賴性
接口與實現分享有助於分層,從而產生更好的結構化系統
2、提高可擴充性
3、實現細節對客戶透明。
四、橋梁模式適用場景
1、如果一個系統需要在構件的抽象化和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的聯系。
2、設計要求實現化角色的任何改變不應當影響客戶端,或者說實現化角色的改變對客戶端是完全透明的。
3、一個構件有多於一個的抽象化角色和實現化角色,並且系統需要它們之間進行動態的耦合。
4、雖然在系統中使用繼承是沒有問題的,但是由於抽象化角色和具體化角色需要獨立變化,設計要求需要獨立管理這兩者。
五、橋梁模式與其它模式
抽象工廠模式(abstract factory模式):抽象工廠模式可以用來創建和配置一個特定的橋梁模式。
適配器模式(adapter模式):適配器模式用來幫助無關的類協同工作。它通常是在系統設計完成之後才會被使用。然而,橋梁模式是在系統開始時就被使用,它使得抽象接口和實現部分可以獨立進行改變。
狀態模式(state模式):橋梁模式描述兩個等級結構之間的關系,狀態模式則是描述一個對象與狀態對象之間的關系。狀態模式是橋梁模式的一個退化的特殊情況。
六、橋梁模式PHP示例
<?php /** * 抽象化角色 * 抽象化給出的定義,並保存一個對實現化對象的引用。 */ abstract class Abstraction { /* 對實現化對象的引用 */ protected $imp; /** * 某操作方法 */ public function operation() { $this->imp->operationImp(); } } /** * 修正抽象化角色 * 擴展抽象化角色,改變和修正父類對抽象化的定義。 */ class RefinedAbstraction extends Abstraction { public function __construct(Implementor $imp) { $this->imp = $imp; } /** * 操作方法在修正抽象化角色中的實現 */ public function operation() { echo 'RefinedAbstraction operation '; $this->imp->operationImp(); } } /** * 實現化角色 * 給出實現化角色的接口,但不給出具體的實現。 */ abstract class Implementor { /** * 操作方法的實現化聲明 */ abstract public function operationImp(); } /** * 具體化角色A * 給出實現化角色接口的具體實現 */ class ConcreteImplementorA extends Implementor { /** * 操作方法的實現化實現 */ public function operationImp() { echo 'Concrete implementor A operation <br />'; } } /** * 具體化角色B * 給出實現化角色接口的具體實現 */ class ConcreteImplementorB extends Implementor { /** * 操作方法的實現化實現 */ public function operationImp() { echo 'Concrete implementor B operation <br />'; } } /** * 客戶端 */ class Client { /** * Main program. */ public static function main() { $abstraction = new RefinedAbstraction(new ConcreteImplementorA()); $abstraction->operation(); $abstraction = new RefinedAbstraction(new ConcreteImplementorB()); $abstraction->operation(); } } Client::main(); ?>
以上就是使用php實現橋梁模式的代碼,還有一些關於裝飾模式的概念區分,希望對大家的學習有所幫助。