代理模式和适配器模式的区别

适配器模式

#include <iostream>
using namespace std;
class subject
{
public:
    virtual void request()=0;
};
class adaptee
{
public:
    void specialRequest(){
        cout << "special request" << endl;
    }
};
class adapter :public subject
{
public:
    adaptee *m_adaptee;
    void request(){
        if (m_adaptee == nullptr){
            m_adaptee = new adaptee();
        }
        m_adaptee->specialRequest();
    }
};
int main()
{
    subject *newadapter=new adapter();
    newadapter->request();
    return 0;
}

代理模式

#include <iostream>
using namespace std;
class subject
{
public:
    virtual void request() = 0;
};
class concreteSubject :public subject
{
public:
    void request(){
        cout << "real request" << endl;
    }
};
class proxy :public subject
{
public:
    concreteSubject *m_concreteSubject;
    void request(){
        if (m_concreteSubject == nullptr){
            m_concreteSubject = new concreteSubject();
        }
        m_concreteSubject->request();
    }
};

int main()
{
    subject *newProxy = new proxy();
    newProxy->request();
    return 0;
}

区别在于被替代的类是否继承于subject

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

再上一个通俗易懂的版本

适配器模式:小刘去美国旅游,想代购化妆品回国但是对当地语言不通,于是请当地人山姆代替她买商品。

代理模式:小刘刚刚移民美国,由于太忙没有时间,于是请当地人山姆代替她买商品。

区别就是:小刘是不是美国人!即是否继承自美国公民类。

适配器模式

class 美国公民
{
public:
    virtual void 购买商品()=0;
};
class 游客
{
public:
    void 购买商品(){
        cout << "购买成功" << endl;
    }
};
class 当地人 :public 美国公民
{
public:
    游客 * m_游客;
    void 购买商品(){
        if (m_游客 == nullptr){
            m_游客 = new 游客();
        }
        m_游客->购买商品();
    }
};
int main()
{
    美国公民 *山姆 = new 当地人();
    山姆->购买商品();
    return 0;
}

代理模式

#include <iostream>
using namespace std;
class 美国公民
{
public:
    virtual void 购买商品() = 0;
};
class 新移民 :public 美国公民
{
public:
    void 购买商品(){
        cout << "购买成功" << endl;
    }
};
class 当地人 :public 美国公民
{
public:
    新移民 *m_新移民;
    void 购买商品(){
        if (m_新移民 == nullptr){
            m_新移民 = new 新移民();
        }
        m_新移民->购买商品();
    }
};

int main()
{
    美国公民 *山姆 = new 当地人();
    山姆->购买商品();
    return 0;
}

 

 

compare之后很清楚看到差别

偶然发现vs编译器竟然支持中文。。。。。。

转载于:https://www.cnblogs.com/hustwx/p/9962042.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值