極簡設計模式-介面卡模式

long2ge發表於2021-12-04

定義

將一個介面轉換成客戶所期望的另一個介面,使介面不相容的那些類可以一起工作。

設計的原則和思想

  1. 解耦的是目標類(介面卡類)和適配者類。
  2. 不變部分是適配者,變化部分是介面卡。
  3. 核心思想是將類中原本不相容的介面轉換成相容的介面。是一種事後的補救策略。

一句話概括設計模式

將介面轉換成另一個介面,消除不相容問題。

介面卡模式分三種

  1. 類介面卡
  2. 物件介面卡
  3. 介面介面卡模式(預設介面卡模式)

類介面卡和物件介面卡

結構中包含的角色

  1. Target(目標抽象類)
  2. Adapter(介面卡類)
  3. Adaptee(適配者類)

最小可表達程式碼

// 目標抽象類
interface Target
{
    public function outputA();
}

// 適配者類
class Adaptee
{
    public function outputB(){}
}

// 類介面卡
class ClassAdapter extends Adaptee implements Target 
{  
    public function outputA() 
    {  
        echo '類介面卡的業務處理';
    }  
}

// 物件介面卡
class ObjectAdapter implements Target 
{  
    private $adaptee;

    public function __construct(Adaptee $adaptee)
    {  
        $this->adaptee = $adaptee;  
    }

    public function outputA()
    {
        echo '物件介面卡的業務處理';
    }  
}

(new ClassAdapter())->outputA();
(new ObjectAdapter(new Adaptee))->outputA();

介面介面卡模式(預設介面卡模式)

結構中包含的角色

  1. Target(目標抽象類)
  2. DefaultAdapter(預設介面卡類)
  3. ConcreteAdapter(具體介面卡類)

最小可表達程式碼

interface Target
{
    public function outputA();
    public function outputB();
}

abstract class DefaultAdapter implements Target
{
    public function outputA(){}
    public function outputB(){}
}

class ConcreteAdapter extends DefaultAdapter
{
    public function outputA() 
    {  
        echo '介面介面卡的業務處理';
    }  
}

(new ConcreteAdapter())->outputA();

優點

  1. 可以讓任何兩個沒有關聯的類一起執行。
  2. 可以將介面或資料轉換程式碼從程式主要業務邏輯中分離。
  3. 將目標類和適配者類解耦,透過引入一個介面卡類來重用現有的適配者類,無須修改原有結構。

缺點

  1. 過多地使用介面卡,會讓系統非常零亂,不易整體進行把握。
  2. 程式碼整體複雜度增加。

何時使用

  1. 封裝有缺陷的介面設計
  2. 統一多個類的介面設計
  3. 透過介面轉換,將一個類插入另一個類系中。
  4. 相容老版本介面
  5. 適配不同格式的資料
  6. 系統需要使用現有的類,而此類的介面不符合系統的需要。

實際應用場景

  1. 美國電器 110V,中國 220V,就要有一個介面卡將 110V 轉化為 220V。
  2. 在 LINUX 上執行 WINDOWS 程式。

類介面卡和物件介面卡

類介面卡
    這一實現使用了繼承機制 : 介面卡同時繼承兩個物件的介面。請注意,這種方式僅能在支援多重繼承的程式語言中實現,例如 C++。

物件介面卡
    實現時使用了構成原則 : 介面卡實現了其中一個物件的介面, 並對另一個物件進行封裝。 所有流行的程式語言都可以實現介面卡。
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Long2Ge

相關文章