适配器模式
#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编译器竟然支持中文。。。。。。