zoukankan      html  css  js  c++  java
  • 【设计模式】适配器模式

    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 的样子变出了另一个小A
    class 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形式的接口就可以被客户使用了。

     

  • 相关阅读:
    CUDA和cudnn的环境变量设置问题
    zsh-Ubuntu更实用终端
    应用安全
    应用安全
    应用安全
    操作系统
    应用安全
    应用安全
    操作系统
    密码学
  • 原文地址:https://www.cnblogs.com/cuish/p/3868552.html
Copyright © 2011-2022 走看看