設計模式(6) 適配器模式

  • 結構型模式
  • 適配器模式
  • 類適配器和對象適配器

結構型模式

結構型模式的重點在於如何通過靈活的體系組織不同的對象,並在此基礎上完成更爲複雜的類型(或者類型系統),而參與組合的各類型之間始終保持儘量鬆散的結構關係。
結構型模式包括以下幾種:

  • 適配器模式
  • 橋接模式
  • 組合模式
  • 裝飾模式
  • 外觀模式
  • 享元模式
  • 代理模式

適配器模式

GOF對適配器模式的描述爲:
Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype..
— Design Patterns : Elements of Reusable Object-Oriented Software

使用適配器模式主要有兩個方面的目的:

  • 舊接口在新的環境下不兼容時,藉助適配器模式完成從舊接口到新接口的轉換。
  • 將“既有系統”進行封裝,邏輯上客戶程序不知道“既有系統”的存在,將變化隔離在Adapter部分。如果客戶程序需要遷移,僅需要在Adapter部分做修改。

類適配器和對象適配器

適配器的實現一般有兩種方式:

  • 類適配器,通過繼承讓適配器類具有既有類型的特點,同時也可以根據客戶程序的需要,滿足新接口的需要
  • 對象適配器,在適配器裏保存一個既有類型的引用,它自身按照客戶程序的要求,實現新接口。

定義ITarget和Adaptee

public interface ITarget
{
    void Request();
}
public class Adaptee
{
    public void SpecifiedRequest() { }
}

類適配器

public class ObjectAdapter : Adaptee, ITarget
{
    public void Request()
    {
        //其他處理
        //...
        base.SpecifiedRequest();
        //...
    }
}

對象適配器

public class ClassAdapter : ITarget
{
    private Adaptee adaptee;

    public void Request()
    {        
        //其他處理
        //...
        adaptee.SpecifiedRequest();
        //...
    }
}

兩者的區別有:

類適配器 對象適配器
基於繼承概念 基於對象組合的思路
適配器之前不能繼承自其他類、 Target只能是接口形式的ITarget Target可能是ITarget(接口), TargetRase(抽象類),甚至是實體類,只要Adapter滿足不繼承兩個或兩個以上類的限制即可
可以覆蓋 Adaptee的某些方法 無法覆蓋 Adaptee的方法
雖然不可以適配子類,但可以通過覆蓋修改某些方法,部分情況下可以達到配子類同樣的效果 不僅可以適配 Adaptee,還可以適配 Adaptee的任何子類

類適配器和對象適配器最大的區別在於對既有類型的使用上,在擴展新功能的時候,前者使用了繼承,後者使用組合的方式。對象適配器相對而言是被推薦的方式,因爲使用組合帶來的耦合往往比繼承更鬆散。

對象適配器的UML類圖爲:

所以適配器模式主要包括三個角色:

  • Target(ITarget):調用端所期待的接口;
  • Adaptee:需要被適配的類型;
  • Adapter:適配器,完成從Adaptee到Target的轉換。

適配器模式是一種相對簡單,而且使用廣泛的模式,在需要實現接口間的兼容、隔離變化的時候,是一種很好的選擇。

參考書籍:
王翔著 《設計模式——基於C#的工程化實現及擴展》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章