定義
將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
設計的原則和思想
- 解耦的是抽象部分和實現的部分。
- 不變部分是抽象部分,變化部分是實現部分。
- 核心思想是透過組合的方式,讓類的個數從指數增長下降到線性增長。
一句話概括設計模式
一個類存在多個獨立變化的維度,透過組合的方式,讓多個維度可以獨立地變化。
經典版本
結構中包含的角色
- Abstraction(抽象類)
- RefinedAbstraction(擴充抽象類)
- Implementor(實現類介面)
- ConcreteImplementor(具體實現類)
最小可表達程式碼
interface Implementor {}
abstract class Abstraction
{
protected $impl;
public function __construct(Implementor $impl)
{
$this->impl = $impl;
}
public abstract function hand();
}
class ConcreteImplementor implements Implementor{}
class RefinedAbstraction extends Abstraction
{
public function hand()
{
echo '執行';
}
}
$impl = new ConcreteImplementor();
$abstraction = new RefinedAbstraction($impl);
$abstraction->hand();
JDBC版本
結構中包含的角色
- Driver(抽象類)
- ConcreteDriver(具體抽象類)
- Connection(實現類介面)
- ConcreteConnection(具體實現類)
- DriverManager (橋接類) 連線兩個變化維度的中間類
最小可表達程式碼
interface Driver{}
class ConcreteDriver implements Driver{}
interface Connection{}
class ConcreteConnection implements Connection{}
class DriverManager
{
protected $driver;
protected $connection;
public function __construct(Driver $driver, Connection $connection)
{
$this->driver = $driver;
$this->connection = $connection;
}
public function hand()
{
echo '執行';
}
}
$manager = new DriverManager(new ConcreteDriver, new ConcreteConnection);
$manager->hand();
優點
- 抽象和實現的分離,並且互不相互影響。
- 用一種巧妙的方式處理多層繼承存在的問題,用抽象關聯取代了傳統的多層繼承,將類之間的靜態繼承關係轉換為動態的物件組合關係。
缺點
- 增加系統的理解與設計難度。
- 要求針對抽象設計和程式設計,程式碼更加複雜。
何時使用
- 一個類存在兩個(或多個)獨立變化的維度,且這兩個(或多個)維度都需要獨立進行擴充套件。
- 需要解決繼承導致系統類的個數急劇增加的問題。
- 系統需要對抽象化角色和實現化角色進行動態切換。
- 想要拆分或重組一個具有多重功能的龐雜類 (與多個資料庫伺服器進行互動的類)。
實際應用場景
- 商城筆記本的型號和品牌
- JDBC
為什麼叫橋接模式
類似一條連線兩個獨立變化維度的橋接。
抽象和實現是什麼意思?
抽象 :
不是抽象類或者介面。而是跟具體的資料庫無關的、被抽象出來的一套類庫,例如JDBC。
實現 :
不是介面的實現類。而是跟具體資料庫相關的一套類庫,比如,com.mysql.jdbc.Driver。
怎樣識別一個類中所具有的獨立變化維度。
抽象類 : 與業務方法關係最密切的維度。
實現類 : 另一個維度。
本作品採用《CC 協議》,轉載必須註明作者和本文連結