简介
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。
可以详细控制访问某个类(对象)的方法,在调用这个方法前作的前置处理(统一的流程代码放到代理中处理)。调用这个方法后做后置处理。
优点:
通过一个代理对象完成一系列的处理,在将来的程序改动中,就会允许动态更改、添加、删除和重新定位对象,这使开发人员的发布变得透明,符合开闭原则。
代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
代理模式在架构中还可以让虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
缺点:
要求对服务描述进行标准化,我们要使用代理模式时则需要考虑异步处理机制、协议创建流程和错误环境控制,比较的繁琐。
使用场景
比如你有一个工厂开始是生产手机的,但是它现在不想自己生产了,它把自己的东西交给了一家代工厂富士康去生产
小王想追求小娟,但他不认识小娟。但他的朋友小林认识小娟,所以他通过让小林帮忙送礼物的方式追求小娟
代码如下:
#include <iostream>
#include <string>
#include <memory>
#include <map>
class belle
{
public:
belle(std::string name) : m_name(name)
{
}
const std::string &getname(void)
{
return m_name;
}
private:
std::string m_name;
};
class givegift
{
public:
virtual void give_flowers(void) = 0;
virtual void give_house(void) = 0;
};
class lady_killer : public givegift
{
public:
lady_killer(belle xjj) : m_belle(xjj)
{
}
void give_flowers(void)
{
std::cout << "give_flowers .." << std::endl;
}
void give_house(void)
{
std::cout << "give_house .." << std::endl;
}
private:
belle m_belle;
};
class proxy : public givegift
{
public:
proxy(belle xjj)
{
m_lady_killer = new lady_killer(xjj);
}
virtual void give_flowers()
{
m_lady_killer->give_flowers();
}
virtual void give_house()
{
m_lady_killer->give_house();
}
private:
lady_killer* m_lady_killer;
};
int main()
{
std::cout << "start-up .." << std::endl;
belle bl("斯嘉丽");
proxy px(bl);
px.give_flowers();
px.give_house();
std::cout << "done .." << std::endl;
return 0;
}
运行结果: