c++设计模式之代理模式

来源:互联网 发布:java与模式 阎宏 pdf 编辑:程序博客网 时间:2024/04/28 22:52

                                                                                                                             代理模式

定义:为其他对象提供一种代理以控制对这个对象的访问

代理模式的要点:

1. 代理模式与真实对象有同样的接口,这样保证在任何使用 RealSubject 的地方都可以使用 Proxy

2. Proxy 保存一个真实象的引用,这样可以访问 RealSubject 对象。

代理的种类

如果按照使用目的来划分,代理有以下几种:

远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。 也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。  

Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。

保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。 用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。

Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。 防火墙(Firewall)代理:保护目标,不让恶意用户接近。 同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。

智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。 是指当调用真实的对象时,代理处理另外一些事。如计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放它;或当第一次引用一个持久对象时,将它装入内存;或在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变它。它们都是通过代理在访问一个对象时附加一些内务处理。

在所有种类的代理模式中,虚拟(Virtual)代理、远程(Remote)代理、智能引用代理(Smart Reference Proxy)和保护(Protect or Access)代理是最为常见的代理模式。


UML图

                            

当我想要追一个漂亮的girl时,我又忙于工作学习,这时候我又不想放弃这个girl,因为这是个mm,这时候我就需要一个代理具有我的功能,以我的名义来追这个女孩。——————代理模式就此产生。

/*
代理模式 (追女朋友)  
*/ 


#include<iostream>
using namespace std;
class shortgirl{
private:
string name;
public:
shortgirl(string name){
this -> name = name;
}
string getname(){
return name;
}
};
class Interface{
public:
Interface(){} 
virtual void GiveDolls() = 0;
virtual void GiveFlowers() = 0;
virtual void Givechoclates() = 0;
};
class Pursuit:public Interface{
private:
string name;
shortgirl *mm;
public:
Pursuit(string name,shortgirl *mm){
this -> name = name;
this -> mm = mm;
}
void GiveDolls(){
cout<<name<<"送"<<mm->getname()<<"洋娃娃"<<endl; 
}
void GiveFlowers(){
cout<<name<<"送"<<mm->getname()<<"花"<<endl; 
}
void Givechoclates(){
cout<<name<<"送"<<mm->getname()<<"巧克力"<<endl; 
}
};
class proxy:public Interface{
private:
Pursuit *p;
public:
proxy(string name,shortgirl *mm):Interface(){
p = new Pursuit(name,mm);
}
void GiveDolls(){
p -> GiveDolls();
}

void GiveFlowers(){
p -> GiveFlowers();
}

void Givechoclates(){
p -> Givechoclates();
}
};
int main (void)
{

string girlname;
string pursuitname;
cout<<"请输入追求者姓名:";
cin>>pursuitname;
cout<<"请输入美眉姓名:";
cin>>girlname;
shortgirl  *mm = new shortgirl(girlname);
proxy *p = new proxy(pursuitname,mm);
p -> GiveDolls();
p -> GiveFlowers();
p -> Givechoclates();
cout<<pursuitname<<"和"<<girlname<<"成了"; 
return 0;
}


0 0