代理模式:
1、代理模式简介
为其它对象提供一种代理以控制这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。
代理模式按照使用场景来划分可分为多种,如:远程代理、虚拟代理、防火墙代理、Cache代理及智能引用代理等。但是不管是哪种代理模式只是在使用场景上有所区分,而在具体的实现思想上则大致相同。
2、代理模式的使用场景
主要是为其他对象提供一种代理以控制对这个对象的访问。如现有A对象和C对象,C对象想要访问A对象,在这个流程中就可按照需求及场景来使用代理模式,通过引用B对象来实现C对象对A对象的访问(C->B->A)
3、和适配器及装饰者模式的区别
适配器模式主要是为了解决两个类或工程中需要互相耦合但是接口不兼容的问题,适配器模式对其中一个类加一层封装之后提供可调用的接口给另一个类。从而达到接口兼容的目的;装饰器模式则是在原有的类中增加新的功能,在不违背六大设计原则的前提下实现扩展的目的;相比较两者而言,代理类模式则主要是相当于增加了一个中间层,在中间层做一些必要的处理。
优点:
职责清晰。真实的角色只负责实现实际的业务逻辑,不用关心其它非本职责的事务,通过后期的代理完成具体的任务。这样代码会简洁清晰。
代理对象可以在客户端和目标对象之间起到中介的作用,这样就保护了目标对象。
扩展性好。
/*
* 关键代码:一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理对象实现同一个接口,先访问代理* 类再访问真正要访问的对象。
*/
#include <iostream>
using namespace std;
class Gril
{
public:
Gril(const string& name = "gril"):m_string(name){}
string getName()
{
return m_string;
}
private:
string m_string;
};
class Profession
{
public:
virtual ~Profession(){}
virtual void profess() = 0;
};
class YoungMan : public Profession
{
public:
YoungMan(const Gril& gril):m_gril(gril){}
void profess()
{
cout << "Young man love " << m_gril.getName().data() << endl;
}
private:
Gril m_gril;
};
class ManProxy : public Profession
{
public:
ManProxy(const Gril& gril):m_pMan(new YoungMan(gril)){}
~ManProxy()
{
delete m_pMan;
m_pMan = nullptr;
}
void profess()
{
m_pMan->profess();
}
private:
YoungMan* m_pMan;
};
int main(int argc, char *argv[])
{
Gril gril("heihei");
ManProxy* proxy = new ManProxy(gril);
proxy->profess();
delete proxy;
proxy = nullptr;
return 0;
}