首页 > 代码库 > 【设计模式】适配器模式

【设计模式】适配器模式

 

1、简单说明 

适配器模式
将一个类的接口 转换成 客户所希望的 另外一个接口。 Adapter模式使得原本由于
接口不兼容而不能一起工作的可以一起工作。


人物:客户, 接口A, 接口B

客户:小A啊,你这接口我用不了啊,你看我这把老骨头,也不能让我去适应你啊是不是,
呵呵,你应该向小B学习一下呀,他的接口就蛮不错的嘛~


接口A:老板呀,您是这个意思啊,好的呀,我最近练功的时候无意中获得一个宝贝,
这个宝贝可以变形,看我编程小B那样的接口伺候您老哈~


接口B:....

画外音:小A默默到了悬崖半山腰的山洞里,看了看四下无人,然后拿出Adapter这个宝贝
自言自语的说...


小A:魔镜墨镜,到底... 啊 错了错了。。 应该是:万能的Adapter,快点把我变成小
B那样的接口,变 变 变!!!


只见天空光芒四射,一个Adapter变出了一另外一个小A,可不同的是小A的接口看起来
像是小B那样的了,可是只是接口变成了小B的,可是小A的功能还是自己的。
小A见大功告成,然后开开心心的回去见客户了。

小A:客户,哈哈 快看我!


客户: 哇塞,小A 你太牛了,现在让我来用用你!


三炷香的时间之后...
客户:啊,不错 不错, 小A, 我很满意啊!!! 和小B用起来一样舒服 哈哈!


小A: 谢谢哈 么么哒~


小B:沉默...(管我鸟事...)

 

 

2、代码为例

//【小B】class CClassB  {public:    CClassB();    virtual ~CClassB();    virtual void Show(); //小B的接口};CClassB::CClassB(){}CClassB::~CClassB(){}void CClassB::Show(){    cout << endl << "我是小B, 这是我干的,我为自己代言!" << endl;}//【小A】class CClassA{public:    CClassA();    virtual ~CClassA();    int Func(int a);    //小A的接口};CClassA::CClassA(){}CClassA::~CClassA(){}int CClassA::Func(int a){    cout << endl <<"我是小A吆," << "我的值是 " << a << ", 我为该起捏方便面事件负责吆!" << endl;    return 0;}//【另一个小A】,相当于Adapter//小A的神器 用小B 的样子变出了另一个小Aclass CAnotherA : public CClassB{public:    CAnotherA(int nVal, CClassA* ptrA);    virtual ~CAnotherA();    virtual void Show();   //【另一个小A】的和小B一样的接口protected:    CClassA* m_ptrA;       //原来小A的一个实例    int m_nValue;};CAnotherA::CAnotherA(int nVal, CClassA* ptrA) : m_nValue(nVal), m_ptrA(ptrA){}CAnotherA::~CAnotherA(){if(NULL != m_ptrA) delete m_ptrA; m_ptrA = NULL;}void CAnotherA::Show(){    if(NULL == m_ptrA)        return;    m_ptrA->Func(m_nValue);  //小A中原有的接口}

 

 

 

客户端

int _tmain(int argc, _TCHAR* argv[]){    //小B    CClassB* pB = new CClassB();    //小B的接口    pB->Show();    cout << endl;    delete pB; pB = NULL;    //另一个小A登场,CAnotherA是经过包装过的小A    pB = new CAnotherA(10, new CClassA());    pB->Show();    cout << endl << endl;    return 0;}

 

 

 

 

3、执行结果

 

适配器把小A变成了类似小B的【另一个小A】,提供给客户使用。

这样小A形式的接口就可以被客户使用了。