(1)为其他对象提供一种代理以控制对这个对象的访问
①代理模式在客户和被客户访问的对象之间,引入了一定程度的间接性,客户是直接使用代理,让代理来与被访问的对象进行交互。
②这种附加的间接性增加了灵活性和不同的用途。
(2)代理模式的结构和说明
①Proxy:代理对象,通常实现与具体的目标对象一样的接口,这样就可以使用代理来代替具体的目标对象。
A、保存一个指向具体目标对象的指针,可以在需要的时候调用具体的目标对象,若RealSubject和Subject的接口相同,Proxy会引用Subject,并控制对具体目标对象的访问。
B、可以为代理类传入一个RealSubject的引用。也可以在Proxy内部自己创建一个RealSubject,并可能负责创建和删除它
C、从Subject继承,这样代理就可以用来替代目标对象。
②Subject:目标接口,定义代理和具体目标对象的接口,这样可以在任何使用具体目标对象的地方使用代理对象,让客户端透明地使用代理。
③RealSubject:具体的目标对象,真正实现目标接口要求的功能。
(3)思考代理模式
①代理模式的本质:控制对象访问,通过代理目标对象,把代理对象插入到客户和目标对象之间,从而为客户和目标对象引入一定的间接性。正是这个间接性,给代理对象很多活动空间。代理对象可以在调用具体的目标对象前后,附加很多操作,从而实现新的功能或扩展功能。更狠的是,代理对象还可以不去创建和调用目标对象,也就是说,目标对象被完全代理掉了(替换)
②代理模式的动机:在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者或系统结构带来很多麻烦。这时可以增加一个代理对象,以不失透明操作对象的同理来管理/控制对对象的访问。
③代理模式的实现:主要使用对象的组合和委托。但也可以采用对象继承的方式来实现代理。
【编程实验】联系代理(而不是歌星本人)开演唱会

//声明文件
#include <iostream>
using namespace std;
#include "Flyweight.h"
//结构型模式:代理模式
//场景:联系代理(而不是歌星本人)开演唱会
class CStar{
public:
virtual void Confer() = 0;//面谈
virtual void SignContract() = 0;//签合同
virtual void BookTicket() = 0; //订票
virtual void Sing() = 0; //唱歌
virtual void CollectMoney() = 0; //收钱
};
//RealStar
class CRealStar : public CStar{
public:
void Confer();
void SignContract();
void BookTicket();
void Sing();
void CollectMoney();
};
//ProxyStar
class CProxyStar : public CStar{
private:
CStar* pRealStar;
public:
CProxyStar(CStar* realstar);
void Confer();
void SignContract();
void BookTicket();
void Sing();
void CollectMoney();
};//实现文件
//RealStar
void CRealStar::Confer(){ cout << "Star : 面谈" << endl; }
void CRealStar::SignContract(){ cout << "Star : 签合同" << endl; }
void CRealStar::BookTicket(){ cout << "Star : 订票" << endl; }
void CRealStar::Sing(){ cout << "Star : 唱歌" << endl; }
void CRealStar::CollectMoney(){ cout << "Star : 收钱" << endl; }
//ProxyStar
CProxyStar::CProxyStar(CStar* realstar){ pRealStar = realstar;}
void CProxyStar::Confer(){ cout << "Assistant : 面谈" << endl; }
void CProxyStar::SignContract(){ cout << "Assistant : 签合同" << endl; }
void CProxyStar::BookTicket(){ cout << "Assistant : 订票" << endl; }
void CProxyStar::Sing(){ pRealStar->Sing(); }
void CProxyStar::CollectMoney(){ cout << "Assistant : 收钱" << endl; }//测试客户端
void main()
{
CStar* pRealStar = new CRealStar();
CStar* pProxyStar = new CProxyStar(pRealStar);
//面谈、签合同、订票、收钱由代理来做
//实际唱歌时,由代理去找真实明星来唱,对于客户端不需要
//直接和真实明白打交道。
pProxyStar->Confer();
pProxyStar->SignContract();
pProxyStar->BookTicket();
pProxyStar->Sing();//唱歌时由代理去找真实明星来唱
pProxyStar->CollectMoney();
}
本文介绍了代理模式的概念、结构及其应用场景。代理模式通过引入代理对象来控制对目标对象的访问,为对象之间的交互提供了额外的控制机制。
1459

被折叠的 条评论
为什么被折叠?



