極簡設計模式-橋接模式

long2ge發表於2021-12-04

定義

將抽象部分與它的實現部分分離,使它們都可以獨立地變化。

設計的原則和思想

  1. 解耦的是抽象部分和實現的部分。
  2. 不變部分是抽象部分,變化部分是實現部分。
  3. 核心思想是透過組合的方式,讓類的個數從指數增長下降到線性增長。

一句話概括設計模式

一個類存在多個獨立變化的維度,透過組合的方式,讓多個維度可以獨立地變化。

經典版本

結構中包含的角色

  1. Abstraction(抽象類)
  2. RefinedAbstraction(擴充抽象類)
  3. Implementor(實現類介面)
  4. 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版本

結構中包含的角色

  1. Driver(抽象類)
  2. ConcreteDriver(具體抽象類)
  3. Connection(實現類介面)
  4. ConcreteConnection(具體實現類)
  5. 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();

優點

  1. 抽象和實現的分離,並且互不相互影響。
  2. 用一種巧妙的方式處理多層繼承存在的問題,用抽象關聯取代了傳統的多層繼承,將類之間的靜態繼承關係轉換為動態的物件組合關係。

缺點

  1. 增加系統的理解與設計難度。
  2. 要求針對抽象設計和程式設計,程式碼更加複雜。

何時使用

  1. 一個類存在兩個(或多個)獨立變化的維度,且這兩個(或多個)維度都需要獨立進行擴充套件。
  2. 需要解決繼承導致系統類的個數急劇增加的問題。
  3. 系統需要對抽象化角色和實現化角色進行動態切換。
  4. 想要拆分或重組一個具有多重功能的龐雜類 (與多個資料庫伺服器進行互動的類)。

實際應用場景

  1. 商城筆記本的型號和品牌
  2. JDBC

為什麼叫橋接模式

類似一條連線兩個獨立變化維度的橋接。

抽象和實現是什麼意思?

抽象 : 
    不是抽象類或者介面。而是跟具體的資料庫無關的、被抽象出來的一套類庫,例如JDBC。

實現 : 
    不是介面的實現類。而是跟具體資料庫相關的一套類庫,比如,com.mysql.jdbc.Driver。

怎樣識別一個類中所具有的獨立變化維度。

抽象類 : 與業務方法關係最密切的維度。
實現類 : 另一個維度。
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Long2Ge

相關文章