adapter 模式

把一個類的接口轉換爲另一個類的接口(該接口是客戶端期待的接口)。Adapter讓類共同工作,而不會因爲接口的不兼容性而不能用。
#include <iostream>

using namespace std;
class Hindu
{
public:
    virtual ~Hindu() = default;
    virtual void performsHinduRitual() const = 0;
};

class HinduFemale:public Hindu
{
public:
    virtual void performsHinduRitual()const override
    {
    cout<<"Hindu girl performs Hindu ritual"<<endl;
    }
};

class Muslim
{
public:
    virtual ~Muslim() = default;
    virtual void performsMusliRitual() const = 0;
};

class MuslimFemale:public Muslim
{
public:
    virtual void performsMusliRitual()const override
    {
        std::cout<<"Muslim Girl performs Muslim ritual."<<endl;
        }
};

class HinduRitual
{
public:
    void carryOutRitual(Hindu *hindu)
    {
        cout<<"On with the Hindu rituals!"<<endl;
        hindu->performsHinduRitual();
    }

};

class HinduAdapter:public Hindu
{
private:
    Muslim* muslim;
public:
    HinduAdapter(Muslim* m):muslim(m){}
    virtual void performsHinduRitual() const override {muslim->performsMusliRitual();
    }
};

int main()
{
   HinduFemale* hinduGirl = new HinduFemale;
	MuslimFemale* muslimGirl = new MuslimFemale;
	HinduRitual hinduRitual;
//	hinduRitual.carryOutRitual (muslimGirl);  // Will not compile of course since the parameter must be of type Hindu*.
	HinduAdapter* adaptedMuslim = new HinduAdapter (muslimGirl);  // muslimGirl has adapted to become a Hindu!

	hinduRitual.carryOutRitual (hinduGirl);
	hinduRitual.carryOutRitual (adaptedMuslim);  // So now muslimGirl, in the form of adaptedMuslim, participates in the hinduRitual!
                // Note that muslimGirl is carrying out her own type of ritual in hinduRitual though.

	delete adaptedMuslim;  // adaptedMuslim is not needed anymore
	delete muslimGirl; // muslimGirl is not needed anymore
    delete hinduGirl; // hinduGirl is not needed anymore, too
	return 0;
}

在該段代碼中,主要包括如下幾種類。


通過HinduAdapter實現從MuslimFemale轉爲HinduFemale。

rituali表示儀式的意思

Hidu表示印度教

Muslim表示穆斯林

class HinduAdapter:public Hindu
{
private:
    Muslim* muslim;
public:
    HinduAdapter(Muslim* m):muslim(m){}
    virtual void performsHinduRitual() const override {muslim->performsMusliRitual();
    }
};

通過adpter的類,當傳入參數爲muslim時,則執行muslim的函數。

HinduRitual調用的時候,可以根據不同的類,執行相同的接口,實現不同的調用。


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