#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調用的時候,可以根據不同的類,執行相同的接口,實現不同的調用。