代理模式(Proxy)
一、 什么是代理模式
先来看看官方的说法,代理模式就是为其他对象提供一种代理,以控制对这个对象的访问,
代理模式与Android
。看来这个官方的说法的确有点官方,看了还是让人感觉不点不知所措,还是不明白代理模式是什么,究竟是用来做什么的。
其实代理这个名词,对于我们来说其实并不陌生,生活中有很多关于代理的例子。例如校园代理等,就以校园代理来讲,这个校园代理就是为他对应的上司的作代理,而这个校园代理的工作就是访问校园中的学生,例如对学生进行问卷之类的事。在这个例子中,学生就是官方说法中的其他对象,校园代理的上司就通过控制这个校园代理来控制对学生的访问。这下应该明白一点了吧。
二、 代理模式的类图
三、 代理模式的实现代码(C++实现)<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD48cD7S1MnPw+bLtbXE0KPUsLT6wO3OqsD919OjrM7Sw8fAtNK7tsO0+sDtxKPKvbXEt+eyyaOszqrBy7j8usO12MDtveLV4rj2xKPKvaOsu7nKx9Kq1/fSu7XjtcS94srNtcSho9Taz8LD5rXEtPrC69bQo6y9q7P2z9bI/bj2wOCjrFdvcmtlcqGiQm9zc7rNU2Nob29sUHJveHmjrMv7w8e31rHwttTTpsnPzby1xFN1YmplY3SholJlYWxTdWJqZWN0us1Qcm94edXiyP249sDgo6y2+NXi0KnA4NbQtcRkb1N1cnZlebe9t6ijrL7NysfP4LWx09rJz8281tC1xFJlcXVlc3S3vbeooaM8L3A+PHA+IDwvcD48cD7XoqO6xuTKtcnPzbzWu8rH0ru49rT6wO3Eo8q9tcRVTUzEo9DNzbyjrFJlcXVlc3TG5Mq1yse0+rHt18XL+dPQUHJveHm6zVJlYWxTdWJqZWN0tcS5stPDvdO/2qOstviyu732vfbKx9XiwO/L+dC0tcTSu7j2oaM8L3A+PHA+IDwvcD48cD7G5Mq1z9a0+sLryOfPwqOocHJveHkuY3Bwo6mjujwvcD48cD4xoaJXb3JrZXLA4LXEtqjS5cjnz8KjrMv809DSu7j2ZG9TdXJ2ZXm1xL3Tv9o8L3A+PHA+PC9wPjxwcmUgY2xhc3M9"brush:java;">class Worker { public: virtual void doSurvey() = 0; virtual ~Worker(){} };
2、Boss类定义如下,它继承Worker类,并实现doSurvey接口
?
1
2
3
4
5
6
7
8
class Boss : public Worker
{
public:
virtual void doSurvey()
{
cout << "The ABCDE company do sruvey!" << endl;
}
};
3、SchoolProxy类定义如下,它同样继承Worker类,并实现doSurvey接口,该类维护一个Boss类的对象的引用,并在它的中doSurvey方法中调用Boss的doSurvey方法。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class SchoolProxy : public Worker
{
public:
SchoolProxy():
_boss(NULL)
{
}
virtual ~SchoolProxy()
{
if(_boss != NULL)
{
delete _boss;
}
}
SchoolProxy(const SchoolProxy&proxy)
{
_boss = newBoss(*proxy._boss);
}
SchoolProxy& perator=(const SchoolProxy &rhs)
{
if(this != &rhs)
{
SchoolProxytmp_proxy(rhs);
Boss *tmp_boss =tmp_proxy._boss;
tmp_proxy._boss = _boss;
_boss = tmp_boss;
}
return *this;
}
virtual void doSurvey()
{
if(_boss == NULL)
{
_boss = new Boss();
}
_boss->doSurvey();
}
private:
Boss *_boss;
};