与前几篇常用的的创建型设计模式(单例模式,工厂模式)不同,今天要说的是常用的结构型模式之一:代理模式
在说代理模式之前,回顾一下创建型设计模式,创建型模式它的主要特点是“将对象的创建与使用分离“ 。在类对象的创建上更加的灵活。
那么结构型模式又有什么不同呢?
结构型模式关注类和对象的组命。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
代理模式为其他对象提供一种代理以控制对这个对象的访问。
简单来说,在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
- 代理对象⻆色内部含有对真实对象的引用,从而可以操作真实对象,
- 同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。
- 代理对象可以在执行真实对象操作时,附加其它的操作,相当于对真实对象进行封装。
看一下示例代码:
ITcompany.h
#ifndef _IT_COMPANY_HEAD_H
#define _IT_COMPANY_HEAD_H
#include <iostream>
using namespace std;
class ItCompany{
public:
virtual void programCode(const string &lang) = 0;
};
#endif
#ifndef _OUTSOUCE_COMPANY_HEAD_
#define _OUTSOUCE_COMPANY_HEAD_
main.cpp
#include "ItCompany.h"
class OutsourceCompany : public ItCompany{
public:
OutsourceCompany(ItCompany *it){
this->it = it;
}
void programCode(const string &lang){
if(lang != "c++" && lang != "c" && lang != "java"){
cout << "I can not use this language : " << lang << endl;
return;
}
it->programCode(lang);
}
private:
ItCompany *it;
};
#endif
#ifndef _NB_COMAPNY_HEAD_
#define _NB_COMAPNY_HEAD_
#include "ItCompany.h"
class NbCompany:public ItCompany{
public:
void programCode(const string &lang){
cout << "we use language : " << lang << " development software" << endl;
}
};
#endif
#include "OutsourceCompany.h"
#include "NbCompany.h"
int main(void)
{
OutsourceCompany *proxyComany = new OutsourceCompany(new NbCompany);
proxyComany->programCode("c++");
proxyComany->programCode("python");
return 0;
}
优点
- 代理模式能够将真正被调用的对象进行隔离,在一定程度上降低了系统的耦合度
- 代理对象在客户端和目标对象之间起到一个中介的作用,这样可以起到对目标对象的保护。代
- 理对象可以在对目标对象发出请求之前进行一个额外的操作,例如: 权限检查等
缺点
- 由于在客户端和真实主题之间增加了一个代理对象,所以会造成请求的处理速度变慢
- 实现代理类也需要额外的工作,从而增加了系统的实现复杂度