应用场景
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。
代理模式也可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须由系统的其他角色代为创建并传入。
优缺点
- 职责清晰:真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
- 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
- 高扩展性
代理模式与装饰器模式的区别
代理模式:
- 强调的是控制访问。即在不改变接口的前提下,控制对象的访问,可以增加方法的行为,甚至彻底改变行为。比如下述的实例当中,代理更改了被代理对象的功能,并且控制了被代理对象的访问。
装饰模式:
- 强调的是功能的扩充。即在不改变接口的前提下,动态扩展对象的功能,但不饿能修改原方法的行为。比如之前介绍过的装饰模式实例,无论给Person装饰什么衣服,但是Person自身的show方法都没有改变,只能增加功能,不能修改功能。
ps:此处仅限个人理解,如有错误请留言。
Java的三种代理
具体可参考Java的三种代理模式
实例(C++实现静态代理)
#include <iostream>
#include <string>
using namespace std;
//客户端分辨不出代理主题对象与真实主题对象。
//代理模式可以并不知道真正的被代理对象,
//而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,
//被代理对象必须有系统的其他角色代为创建并传入。
class SchoolGirl
{
public:
string name;
};
class IGiveGift
{
public:
virtual void giveDolls() = 0;
virtual void giveFlowers() = 0;
};
class Pursuit :public IGiveGift
{
private:
SchoolGirl mm;
public:
Pursuit(SchoolGirl m)
{
mm = m;
}
void giveDolls()
{
cout << mm.name << " 送你娃娃" << endl;
}
void giveFlowers()
{
cout << mm.name << " 送你鲜花" << endl;
}
};
class Proxy :public IGiveGift
{
private:
Pursuit gg;
public:
Proxy(SchoolGirl mm) :gg(mm)
{
//gg=g;
}
void giveDolls()
{
gg.giveDolls();
}
void giveFlowers()
{
gg.giveFlowers();
}
};
int mai12312321n()
{
SchoolGirl lijiaojiao;
lijiaojiao.name = "李娇娇";
Pursuit zhuojiayi(lijiaojiao);
Proxy daili(lijiaojiao);
daili.giveDolls();
cin.get();
return 0;
}