定義
將一個介面轉換成客戶所期望的另一個介面,使介面不相容的那些類可以一起工作。
設計的原則和思想
- 解耦的是目標類(介面卡類)和適配者類。
- 不變部分是適配者,變化部分是介面卡。
- 核心思想是將類中原本不相容的介面轉換成相容的介面。是一種事後的補救策略。
一句話概括設計模式
將介面轉換成另一個介面,消除不相容問題。
介面卡模式分三種
- 類介面卡
- 物件介面卡
- 介面介面卡模式(預設介面卡模式)
類介面卡和物件介面卡
結構中包含的角色
- Target(目標抽象類)
- Adapter(介面卡類)
- 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();
介面介面卡模式(預設介面卡模式)
結構中包含的角色
- Target(目標抽象類)
- DefaultAdapter(預設介面卡類)
- 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();
優點
- 可以讓任何兩個沒有關聯的類一起執行。
- 可以將介面或資料轉換程式碼從程式主要業務邏輯中分離。
- 將目標類和適配者類解耦,透過引入一個介面卡類來重用現有的適配者類,無須修改原有結構。
缺點
- 過多地使用介面卡,會讓系統非常零亂,不易整體進行把握。
- 程式碼整體複雜度增加。
何時使用
- 封裝有缺陷的介面設計
- 統一多個類的介面設計
- 透過介面轉換,將一個類插入另一個類系中。
- 相容老版本介面
- 適配不同格式的資料
- 系統需要使用現有的類,而此類的介面不符合系統的需要。
實際應用場景
- 美國電器 110V,中國 220V,就要有一個介面卡將 110V 轉化為 220V。
- 在 LINUX 上執行 WINDOWS 程式。
類介面卡和物件介面卡
類介面卡
這一實現使用了繼承機制 : 介面卡同時繼承兩個物件的介面。請注意,這種方式僅能在支援多重繼承的程式語言中實現,例如 C++。
物件介面卡
實現時使用了構成原則 : 介面卡實現了其中一個物件的介面, 並對另一個物件進行封裝。 所有流行的程式語言都可以實現介面卡。
本作品採用《CC 協議》,轉載必須註明作者和本文連結