代理模式:
是为目标对象提供一种代理对象,并且在目标对象的基础上增加额外行为。
拿到我们真实世界来类比的话,就好比如明星经纪人、游戏代练、银行信用卡等
明星经纪人是代理明星处理一些常用的业务,游戏代练也是游戏代练员帮忙代肝游戏账号等等
都可以看出是有一个人帮忙处理主体对象,在这其中他们的目标对象都没有发生改变。
应用场景:
- 虚拟代理: 延迟初始化,在真正需要的时候创建(也是为了避免在未使用的时候就分配一部分内存,导致内存提前被分配走,导致我们的cpu占用过大)
- 保护代理: 控制不同种类的客户端对真实对象的访问权限(我觉得就是在“中介”期间,就主动帮我们过滤掉一些信息,导致不用直接告诉我们本人就可以处理判断)
- 缓存代理: 用于需要缓存客户端请求结果(其实也就是在“中介”期间,把一些结果提前存储起来,然后就不需要再重新向目标对象询问,也可以节省一部分的时间)
- 远程代理: 服务对象位于远程服务器,代理解决复杂的网络通信问题
- 智能引用代理: 代理对象对调用原对象的用户进行统计计数,如智能指针虚拟代理: * * 延迟初始化,在真正需要的时候创建(也是为了避免在未使用的时候就分配一部分内存,导致内存提前被分配走,导致我们的cpu占用过大)
优点:
- 客户端只和代理交互,保护目标对象
- 在目标对象基础上功能增强
- 松耦合,扩展性好
- 开闭原则(对扩展开放,对修改关闭)
缺点:
- 会引起文件数量增多
- 客户端和目标对象增加一个代理,会造成请求处理速度变慢
- 增加了系统复杂性
例如:
#include <iostream>
#include <map>
class Number {
public:
virtual int generate(std::string animal) = 0;
};
class LuckyNumber : public Number {
public:
int generate(std::string animal) override {
std::map<std::string, int> numbers = {
{"Rat", 1469},
{"Ox", 2057},
{"Tiger", 1368},
{"Rabbit", 1368},
{"Dragon", 2507},
{"Snake", 2378},
{"Horse", 2378},
{"Goat", 2570},
{"Monkey", 4950},
{"Rooster",4095},
{"Dog", 2057},
{"Pig", 1469},
};
if (numbers.find(animal) == numbers.end()) {
return 0;
}
else {
return numbers[animal];
}
}
};
int main()
{
auto* number = new LuckyNumber();
auto ratNumber = number->generate("Rat");
std::cout << ratNumber << std::endl;
auto horseNumber = number->generate("Horse");
std::cout << horseNumber << std::endl;
return 0;
}