设计模式学习笔记(三):代理模式
《大话设计模式》学习笔记,参考链接 伍迷的小菜编程成长记
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
代理模式的应用:
---------摘自《大话设计模式》
- 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
- 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
- 安全代理,用来控制真实对象访问时的权限。
- 智能指引,是指当调用真实的对象时,代理处理另外一些事。
哑巴是个十足的NBA球迷,对于前段时间的NBA停摆也是有所关注!刚好在看《大话设计模式》,于是试着用代理模式实现一下NBA球员工会代表NBA球员对NBA联盟提出的谈判条件的过程。
整个过程可以简单抽象成以下几个部分:
- 目标对象--NBA联盟(CNBAAlliance)
- 谈判接口(INegotiateInterface)
- 实际对象--NBA球员(CNBAPlayer)
- 代理对象--NBA球员工会(CPlayerLabourUnion)
- 客户调用(main函数)
示例代码
1 //alliance.h
2 #pragma once
3
4 #include <iostream>
5
6 //NBA联盟类
7 class CNBAAlliance
8 {
9 public:
10 CNBAAlliance(void);
11 ~CNBAAlliance(void);
12 std::string GetName(void);
13 void SetName(std::string szName);
14
15 private:
16 std::string m_szName;
17 };
18
19 //alliance.cpp
20 #include "alliance.h"
21
22 CNBAAlliance::CNBAAlliance(void)
23 {
24 }
25
26 CNBAAlliance::~CNBAAlliance(void)
27 {
28 }
29
30 std::string CNBAAlliance::GetName(void)
31 {
32 return this->m_szName;
33 }
34
35 void CNBAAlliance::SetName(std::string szName)
36 {
37 this->m_szName = szName;
38 }
39
40 //negotiateinterface.h
41 #pragma once
42
43 //谈判接口
44 class INegotiateInterface
45 {
46 public:
47 INegotiateInterface(void);
48 ~INegotiateInterface(void);
49 //收益分成
50 virtual void RevenueShare(void) = 0;
51 //球员转会
52 virtual void PlayerTransfer(void) = 0;
53 };
54
55 //negotiateinterface.cpp
56 #pragma once
57
58 //谈判接口
59 class INegotiateInterface
60 {
61 public:
62 INegotiateInterface(void);
63 ~INegotiateInterface(void);
64 //收益分成
65 virtual void RevenueShare(void) = 0;
66 //球员转会
67 virtual void PlayerTransfer(void) = 0;
68 };
69
70 //player.h
71 #pragma once
72
73 #include "alliance.h"
74 #include "negotiateinterface.h"
75
76 //NBA球员类
77 class CNBAPlayer : public INegotiateInterface
78 {
79 public:
80 CNBAPlayer(CNBAAlliance *pAlliance);
81 ~CNBAPlayer(void);
82 void RevenueShare(void);
83 void PlayerTransfer(void);
84
85 private:
86 CNBAAlliance *m_pAlliance;
87 };
88
89 //player.cpp
90 #include <iostream>
91 #include "player.h"
92
93 CNBAPlayer::CNBAPlayer(CNBAAlliance *pAlliance)
94 {
95 this->m_pAlliance = pAlliance;
96 }
97
98 CNBAPlayer::~CNBAPlayer(void)
99 {
100 }
101
102 void CNBAPlayer::RevenueShare(void)
103 {
104 std::cout << this->m_pAlliance->GetName().c_str() << ":球员需要球队收入的51%!" << std::endl;
105 }
106
107 void CNBAPlayer::PlayerTransfer(void)
108 {
109 std::cout << this->m_pAlliance->GetName().c_str() << ":允许三巨头,四大天王这样巨星扎堆的情况!" << std::endl;
110 }
111
112 //playerlabourunion.h
113 #pragma once
114
115 #include "player.h"
116 #include "negotiateinterface.h"
117
118 //球员工会类(代理)
119 class CPlayerLabourUnion : public INegotiateInterface
120 {
121 public:
122 CPlayerLabourUnion(CNBAAlliance *pAlliance);
123 ~CPlayerLabourUnion(void);
124 void RevenueShare(void);
125 void PlayerTransfer(void);
126
127 private:
128 CNBAPlayer *m_pPlayer;
129 };
130
131 //playerlabourunion.cpp
132 #include "player.h"
133 #include "playerlabourunion.h"
134
135 CPlayerLabourUnion::CPlayerLabourUnion(CNBAAlliance *pAlliance)
136 {
137 this->m_pPlayer = new CNBAPlayer(pAlliance);
138 }
139
140 CPlayerLabourUnion::~CPlayerLabourUnion(void)
141 {
142 }
143
144 void CPlayerLabourUnion::RevenueShare(void)
145 {
146 this->m_pPlayer->RevenueShare();
147 }
148
149 void CPlayerLabourUnion::PlayerTransfer(void)
150 {
151 this->m_pPlayer->PlayerTransfer();
152 }
153
154 //main.cpp
155 #include <iostream>
156 #include "alliance.h"
157 #include "playerlabourunion.h"
158
159 int main(void)
160 {
161 std::cout << "球员工会与NBA联盟谈判条件:" << std::endl;
162 CNBAAlliance *pAlliance = new CNBAAlliance();
163 pAlliance->SetName("大卫斯特恩");
164
165 CPlayerLabourUnion *pLabourUion = new CPlayerLabourUnion(pAlliance);
166 pLabourUion->RevenueShare();
167 pLabourUion->PlayerTransfer();
168
169 delete pLabourUion;
170 delete pAlliance;
171
172 return 0;
173 }