天天看點

C++設計模式 | Adapter擴充卡模式

概念

擴充卡模式:将一個類的接口轉化成客戶希望的另外一個接口Adapter模式使得原本由于接口不相容而不能一起工作的哪些類可以一起工作。讓不相容的接口可以在一起工作

擴充卡模式在生活中的一些例子

1.我國的家庭電壓一般都為220V,但是平時我們使用手機或者電腦等一些電器時,這些電器的工作電壓一般都不到20V,是以如何能夠讓我們的電腦或者手機在220V電壓下正常工作呢。顯然不可能。是以我們的電源線上都會有一個配接器,主要是将220V電壓轉為電腦能夠工作的電壓。這個配接器就是連接配接電源220V和電腦20V的一個接口。

2.我記得小時候家裡開始普及自來水的時候。在街道旁邊會鋪設自來水管,這些水管口徑都非常大,但是引入家裡的管道口徑卻很小。這時候就要想辦法能夠将這兩個水管連接配接起來。這就需要一個轉換接口

C++設計模式 | Adapter擴充卡模式

模式結構圖

C++設計模式 | Adapter擴充卡模式

代碼實作

//目标接口類
class Target
{
public:
    virtual void Request() { std::cout << "Target::Request" << std::endl; }
};
//最終用戶端要使用的類
class Adaptee
{
public:
    void SpecificRequest() { std::cout << "Adaptee::SpecificRequest" << std::endl; }
};
//  擴充卡類  轉換接口類
class Adapter : public Target
{
public:
    Adapter() { _ade = new Adaptee(); }
    ~Adapter()
    {
        if (_ade != nullptr)
        {
            delete _ade;
            _ade = nullptr;
        }
    }
    //這樣 雖然調用的是target接口 其實調用的是adaptee接口
    void Request() { _ade->SpecificRequest(); }

private:
    Adaptee *_ade;
};

int main(int argc, char *argv[])
{
    Target *adt = new Adapter();
    adt->Request();
    return 0;
}
           
C++設計模式 | Adapter擴充卡模式

 具體的例子的代碼實作

比如:我們使用電腦時,有時候要将電腦内容投影到投影儀上。

我們的電腦隻支援VGA接口,這時候我們用VGA接口的投影儀。

//抽象類  VGA接口
class VGA
{
public:
    virtual void play() = 0;
};
//VGA接口的投影儀
class TV1 : public VGA
{
public:
    void play()
    {
        cout<<"使用VGA接口的TV1播放視訊"<<endl;
    }
};
class Computer
{
public:
    void playvideo(VGA *vag)
    {
        vag->play();
    }
    
};
int main()
{
    Computer c;
    c.playvideo(new TV1());
    return 0;
}
           
C++設計模式 | Adapter擴充卡模式

但是現在我們隻有HDMI接口的投影儀,而電腦隻支援VGA接口,這時候該怎麼辦呢?

是以我們需要使用一個信号轉換器,将電腦可以支援的VGA信号轉換為投影儀的HDMI信号。

//抽象類  VGA接口
class VGA
{
public:
    virtual void play() = 0;
};
//VGA接口的投影儀
class TV1 : public VGA
{
public:
    void play()
    {
        cout << "使用VGA接口的TV1播放視訊" << endl;
    }
};
class Computer
{
public:
    void playvideo(VGA *vag)
    {
        vag->play();
    }
};

class HDMI
{
public:
    virtual void play() = 0;
};
class TV2 : public HDMI
{
public:
    void play()
    {
        cout << "使用HDMI接口的TV2播放視訊" << endl;
    }
};

//将VGA可以轉化為HDMI接口
class VGA2HDMI : public VGA
{
public:
    VGA2HDMI(HDMI *p) : _hd(p) {}
    //将VGA接口換換為HDMI接口
    void play()
    {
        _hd->play();
    }

private:
    HDMI *_hd;
};

int main()
{
    Computer c;
    //c.playvideo(new TV1());

    c.playvideo(new VGA2HDMI(new TV2()));
    return 0;
}
           
C++設計模式 | Adapter擴充卡模式

繼續閱讀