代理模式的原理:
代理(Proxy)提供了间接对目标对象进行访问的方式,即通过代理对象访问目标对象。其好处是:可以在目标对象实现的功能上,增加额外的功能补充,即扩展目标对象的功能。这就符合了设计模式的开闭原则,即在对既有代码不改动的情况下进行功能的扩展。
举个例子:明星与经纪人之间就是被代理和代理的关系,明星出演活动的时候,明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决。这就是代理思想在现实中的一个例子。
角色 | 说明 |
---|---|
抽象角色 | 声明真实对象和代理对象的共同接口 |
代理角色 | 代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装 |
真实角色 | 代理角色所代表的真实对象,是我们最终要引用的对象 |
代理模式分为 静态代理 和 动态代理。
个人感觉代理模式和外观模式、中介者模式很像,但又有区别!
外观模式:为了方便客户的使用,将后端子系统中所经常用到的接口合集在一起调用,更人性化(常用于前后与后端的交互)!
中介者模式:一个中介人(中介类),给在他这里注册过的所有类进行“通信”,各个类之间不再进行独立的交互,而是进行中介人进行传递信息,使其松耦合(常用于后端与后端,子系统与子系统的交互)!
代理模式:根据真实角色类,在代理类中进行扩张,完成一组特定的操作!
静态代理
我们以上面的例子来说明。
明星就是真实角色,经纪人是代理角色。
现在,明星将要开一场演唱会,那么,明星需要做什么呢?他只需要在演唱会开始时唱歌就行。而其余的工作,全都交给经纪人来安排完成,譬如开演唱会前向粉丝们发送消息,售票安排时间地点等等,演唱会过后给粉丝送小礼物,进行善后的工作等等。
根据需求我们可以知道是使用代理模式来完成。
我们先看看类图吧:
下面是代码:
#include <iostream>
#include <Windows.h>
using namespace std;
// 抽象角色
class Subject {
public:
Subject(const char *name) : name(name) { } // 使用自己赋值自己,相当于 thsi->name = name;
virtual void request() = 0;
protected:
string name;
};
// 真实角色(歌星)
class RealSubject : public Subject {
public:
RealSubject(const char *name) : Subject(name) { } // 使用父类的name赋值从父类继承下来的name
void request() {
cout << name << "开始唱歌" << endl;
}
};
// 代理角色(经纪人)
class Proxy : public Subject {
public:
Proxy(const char *name = "无名字", Subject *ject = NULL) : Subject(name), ject(NULL) { } // 初始化变量
~Proxy() {
delete ject;
}
void before() {
cout << "---唱歌前准备工作---" << endl;
}
void after() {
cout << "---唱歌后收尾工作---" << endl;
}
/****************************************************/
void request() {
if (this->ject == NULL) {
ject = new RealSubject(name.c_str()); // .c_str() 转化为字符串类型
}
/*
* 这里根据项目需求进行更改
*/
this->before(); // 代理类所做的工作
ject->request(); // 真实角色做的工作
this->after(); // 代理类所做的工作
}
private:
Subject *ject; // 定义真实对象
};
int main(void) {
Proxy* pr = new Proxy("周杰伦");
pr->request();
system("pause");
return 0;
}
运行截图:
还有其他许多的例子,比如学生去春游,学生就是真实角色,而老师们就是代理角色,应为老师门需要策划全部的过程,而学生只需要去玩就行了!
动态代理
目前还不会,先占个位置,等会了再补上!