004 --- 第7章 代理模式
简述:
代理模式为其他对象提供一种代理以控制这个对象的访问。
代理模式包括:虚基类、被代理类、代理类。
虚基类:定义了被代理类和代理类的公共接口,这样就在任何使用被代理类的地方都可以使用代理类。
被代理类:继承自虚基类,定义代理类所代表的实体
代理类:继承自虚基类,保存一个被代理类对象,使得代理类可以访问被代理类实体,并提供一个与被代理类的接口相同的接口,这样代理类就可以用来替代被代理类实体。
应用场景:代理类和被代理类继承自同一基类,代理类内部创建被代理类的对象,执行被代理类的逻辑,控制被代理类的访问
注:开发环境调整为VS2017,操作系统win11
代理模式代码:
1 #include <iostream> 2 using namespace std; 3 4 // 虚基类 5 class CSubject 6 { 7 public: 8 virtual void Request() = 0; 9 }; 10 11 // 被代理类 12 class CRealSubject : public CSubject 13 { 14 public: 15 virtual void Request() 16 { 17 cout << "真实的请求" << endl; 18 } 19 }; 20 21 // 代理类 22 class CProxy : public CSubject 23 { 24 private: 25 CRealSubject m_RealSubject; 26 27 public: 28 virtual void Request() 29 { 30 m_RealSubject.Request(); 31 } 32 }; 33 34 int main() 35 { 36 CProxy proxy; 37 proxy.Request(); 38 39 system("pause"); 40 return 0; 41 }
运行结果:
例:替别人追女孩纸
代码如下:
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 // 被追求者类 6 class CSchoolGirl 7 { 8 private: 9 string m_szName; 10 11 public: 12 void SetName(string szName) 13 { 14 m_szName = szName; 15 } 16 17 string GetName() 18 { 19 return m_szName; 20 } 21 }; 22 23 // 送礼物接口类(虚基类) 24 class CGiveGift 25 { 26 public: 27 virtual void GiveDolls() = 0; 28 virtual void GiveFlowers() = 0; 29 virtual void GiveChocolate() = 0; 30 }; 31 32 // 追求者类(被代理类) 33 class CPursuit : public CGiveGift 34 { 35 private: 36 CSchoolGirl* m_pSchoolGirl; 37 38 public: 39 CPursuit(CSchoolGirl* pSchoolGirl) 40 { 41 m_pSchoolGirl = pSchoolGirl; 42 } 43 44 virtual void GiveDolls() 45 { 46 cout << m_pSchoolGirl->GetName() << " 送你洋娃娃" << endl; 47 } 48 49 virtual void GiveFlowers() 50 { 51 cout << m_pSchoolGirl->GetName() << " 送你鲜花" << endl; 52 } 53 54 virtual void GiveChocolate() 55 { 56 cout << m_pSchoolGirl->GetName() << " 送你巧克力" << endl; 57 } 58 }; 59 60 // 代理类 61 class CProxy : public CGiveGift 62 { 63 private: 64 CPursuit* m_pPursut; 65 66 public: 67 CProxy(CSchoolGirl* pSchoolGirl) 68 { 69 m_pPursut = new CPursuit(pSchoolGirl); 70 } 71 72 ~CProxy() 73 { 74 if (m_pPursut) 75 { 76 delete m_pPursut; 77 m_pPursut = NULL; 78 } 79 } 80 81 virtual void GiveDolls() 82 { 83 m_pPursut->GiveDolls(); 84 } 85 86 virtual void GiveFlowers() 87 { 88 m_pPursut->GiveFlowers(); 89 } 90 91 virtual void GiveChocolate() 92 { 93 m_pPursut->GiveChocolate(); 94 } 95 }; 96 97 int main() 98 { 99 CSchoolGirl SchoolGirl; 100 SchoolGirl.SetName("李娇娇"); 101 102 CProxy Proxy(&SchoolGirl); 103 Proxy.GiveDolls(); 104 Proxy.GiveFlowers(); 105 Proxy.GiveChocolate(); 106 107 system("pause"); 108 return 0; 109 }
输出结果: