代理模式:

  代理模式就是给某一个对象提供一个代理,并由代理对象控制对原有对象的引用。在一些情况下,一个客户不想或者不能直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。例如windows桌面端的快捷方式就是一个代理。

代理模式按照使用目的可以分为:

  1. 远程代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是本电脑中,也可以在另一台电脑中。如客户端调用web服务或wcf服务。
  2. 虚拟代理:根据需要创建一个资源消耗较大的对象,使得对象只在需要时才会被真正创建。
  3. Copy-on-Write代理:虚拟代理的一种,把复制(或克隆)拖延到只有在客户端需要时,才真正采取行动。
  4. 保护(Protected or Access)代理:控制一个对象的访问,可以给不同的用户提供不同级别的使用权限。
  5. Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以操作这些结果。
  6. 防火墙(FireWall)代理:保护目标不让恶意用户接近。
  7. 同步化(Synchronization)代理
  8. 智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来。

代理模式角色分四种:

    1)主题接口(Searcher):定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法;

    2)真实主题(RealSeracher):真正实现业务逻辑的类;

    3)代理类(ProxySeracher):用来代理和封装真实主题;

    4)客户端:使用代理类和主题完成工作。

优点:

    1)代理模式能够将调用用于真正被调用的对象隔离,在一定程度上降低了系统的耦合度;

    2)代理对象在客户端和目标对象之间起到一个中介的作用,这样可以起到对目标对象的保护。代理对象可以在对目标对象发出请求之前进行一个额外的操作,例如权限检查等。

缺点:

    1)由于在客户端和真实主题之间增加了一个代理对象,所以会造成请求的处理速度变慢;

    2)实现代理类也需要额外的工作,从而增加了系统的实现复杂度。

区别:

代理模式与适配器模式的区别?

  学习完适配器模式和代理模式之后,会产生这样的疑问:貌似两种模式差不多?两者都是定义了一个目标对象(抽象对象),客户端依赖该抽象对象完成相应功能,这么一解释好像是一样的,那为什么大牛们会分成两种模式呢?适配器模式是因为新旧接口不一致导致出现了客户端无法得到满足的问题,但由于旧的接口是不能被完全重构掉的,因为我们还想使用实现了这个接口的一些服务。那么为了使用以前实现旧接口的服务,我们就应该把新的接口转换成旧接口;实现这个转换的类就是抽象意义的转换器。相比于适配器的应用场景,代理就不一样了,虽然代理也同样是增加了一层,但是,代理提供的接口和原本的接口是一样的,代理模式的作用是不把实现直接暴露给客户端,而是通过代理这个层,代理能够做一些处理。

代理模式与委托的区别?

  1. 代理是模式提供一种"一个类对另外一个类的控制权"是类与类之间关系;委托提供了"一种方法的执行会同时执行加载在上面的方法"是方法与方法之间的关系。
  2. 委托可以代替代理,但是代理不能代替委托。
  3. 委托可以动态加载方法,代理不能实现。
  4. 委托对象所加载的方法不一定要属于同一个类。但是代理的类必须属于同一个类。  

eg:

class SchoolGirl {
public:
	SchoolGirl(string name):mName(name){};
	virtual ~SchoolGirl();
	string getName(){
		return mName;
	}
private:
	string mName;
};
//--------------------------------
class GiveGift {
public:
	GiveGift();
	virtual ~GiveGift();
	virtual void GiveDolls() = 0;
	virtual void GiveFlowers() = 0;
	virtual void GiveChocolate() = 0;
};

class Pursuit : GiveGift{
public:
	Pursuit(SchoolGirl *p): pSchoolGirl(p){};
	virtual ~Pursuit();
	SchoolGirl *pSchoolGirl;
	virtual void GiveDolls() {
		cout<<pSchoolGirl->getName()<<"GiveDolls"<<endl;
	}
	virtual void GiveFlowers() {
		cout<<pSchoolGirl->getName()<<"GiveFlowers"<<endl;
	}
	virtual void GiveChocolate() {
		cout<<pSchoolGirl->getName()<<"GiveChocolate"<<endl;
	}
};

class Proxy : GiveGift{
public:
	Proxy(SchoolGirl *p){
		pPursuit = new Pursuit(p);
	};
	virtual ~Proxy();
	Pursuit *pPursuit;
	virtual void GiveDolls() {
		pPursuit->GiveDolls();
	}
	virtual void GiveFlowers() {
		pPursuit->GiveFlowers();
	}
	virtual void GiveChocolate() {
		pPursuit->GiveChocolate();
	}
};
//--------------------------------
//use
    SchoolGirl *p =new SchoolGirl("girl");
    Proxy *daili =new Proxy(p);
    daili->GiveDolls();
    daili->GiveFlowers();
    daili->GiveChocolate();