程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++設計模式之適配器模式講解

C++設計模式之適配器模式講解

編輯:C++入門知識

C++設計模式之適配器模式講解


C++設計模式之適配器模式

將一個接口轉換成客戶希望的另一個接口使得接口不兼容的那些類可以一起工作

 

一、緣由

適配器模式是我個人使用頻率比較高的模式,十分簡單實用。在許多情況下,我們自己的系統A,要使用既有對象B的接口,但無奈我們的既有系統A和B接口不兼容,這時候適配器可以幫我們解決這個問題。

二、實現

假設現在有一個函數

static void request(Target *target)
{
  target->request();
}

現在我們既有的類Target::request已經無法滿足我們的需求,於是從第三方拿到了一個可以滿足需求的Adaptee類,可惜該類沒有request而只有一個request方法。於是我們需要將Adataptee包裝成一個Adapter類提供一個request接口,同時包裝類是一個Target類的子類,這樣就可以滿足需求了,這種包裝有兩種思路,一種是使用多繼承,同時繼承TargetAdaptee類,一種是使用單繼承,繼承Target然後關聯一個Adaptee。這就是我們說說的 適配器模式,兩種思路分別叫做類適配器模式對象適配器模式。 其UML類圖如下:

類適配器

對象適配器

三、示例代碼

示例代碼如下:

#include 
#include 

using std::string;

class Target {
public:
    virtual ~Target (){};
    virtual void request(){
        std::cout << "request = Target::request" << std::endl;
    }
};

class Adaptee {

public:
    virtual ~Adaptee (){};
    virtual void specificRequest(){
        std::cout << "request = Adaptee::request" << std::endl;
    }
};

#ifdef CLASS_ADAPTER

class Adapter :public Target, public Adaptee {
public:
    virtual ~Adapter (){};
    virtual void request(){
        specificRequest();
    }
};

#else

class Adapter :public Target {
private:
    Adaptee *daptee;
public:
    Adapter():daptee(new Adaptee){}
    virtual ~Adapter(){};
    virtual void request(){
        daptee->specificRequest();
    }
};

#endif

static void request(Target *target)
{
    target->request();
}


int main(void)
{
    Target *target;
    target = new Target;
    request(target);

    target = new Adapter;
    request(target);
}

運行結果:
request = Target::request
request = Adaptee::request
   

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved