設計模式(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 Softwarethis

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

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

類適配器和對象適配器

適配器的實現通常有兩種方式:設計

  • 類適配器,經過繼承讓適配器類具備既有類型的特色,同時也能夠根據客戶程序的須要,知足新接口的須要
  • 對象適配器,在適配器裏保存一個既有類型的引用,它自身按照客戶程序的要求,實現新接口。

定義ITarget和Adaptee代理

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

類適配器code

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

對象適配器對象

public class ClassAdapter : ITarget
{
    private Adaptee adaptee;

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

二者的區別有:blog

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

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

對象適配器的UML類圖爲:
適配器模式 UML類圖接口

因此適配器模式主要包括三個角色:

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

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

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

相關文章
相關標籤/搜索