修改 httpd.conf 文件中:LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_connect_module modules/mod_p"> 设计模式 之美 -- 代理模式 - 11GX
首页 > 设计模式 之美 -- 代理模式

设计模式 之美 -- 代理模式

文章目录

        • 1. 解决问题
        • 2. 应用场景
          • 1. 业务系统的非功能性开发
          • 2. 代理模式在RPC、缓存中的应用
        • 3. 实现
          • C++实现
          • C语言实现

1. 解决问题

客户端和目标对象之间需要进行交互,此时客户端类和目标对象类相关操作之间的逻辑如果交合在一起,会导致客户端和目标对象模块耦合度升高,后期扩展客户端的功能时,则需要修改两者的源代码。

这样的架构设计在系统更加庞大(网络通信链路庞杂,功能增删频繁)的场景下,维护成本极高。

所以,推出代理模式,在客户端和目标对象之间增加代理类,客户端仅需要调用代理类相关的接口,即可完成对目标对象的操作;当客户端调用新的对象时,仅需要扩展代理类的接口即可。

2. 应用场景

1. 业务系统的非功能性开发

监控、统计、鉴权、事务、幂等、日志 这一些附加功能

通过代理模式,将其与业务功能解耦,在代理类中同一处理,程序员仅需关注业务方面的开发,附加功能的调用仅需通过代理类提供的封装好的接口即可。

如:Spring AOP切面 即为代理模式

2. 代理模式在RPC、缓存中的应用

通过远程代理,将网络通信、数据编解码等细节隐藏起来。客户端使用RPC时就像使用本地函数一样,无需了解和服务器的交互细节。

RPC服务的开发者也只需开发业务逻辑,就像开发本地函数一样,不需要关注跟客户端的交互细节。

代理模式在缓存中应用,对于需求中开发一个接口请求的缓存功能,支持缓存、支持实时查询两个接口。此时,随着需求的增加,每个需要都需要增加以上两个接口,这显著增加了开发成本,且会让代码臃肿。

此时增加代理模式,使用动态代理的方式维护 缓存功能的两个接口:支持缓存和支持查询。

3. 实现

C++实现

实现功能:

出版社:被代理对象,要卖书

淘宝、当当网:代理对象

客户端通过当当网进行买书。

#include using namespace std;/*
subject(抽象主题角色)真实主题与代理主题的共同接口。RealSubject(真实主题角色):定义了代理角色所代表的真实对象。 Proxy(代理主题角色):含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真是主题对象之前或者之后执行某些操作,而不是单纯返回真实的对象。提示:a中包含b类;a、b类实现协议类protocol 
*/class  Subject
{ 
public:virtual void SaleBook() = 0;
protected:
private:
};class  RealSubject : public Subject
{ 
public:virtual void SaleBook(){ cout << "卖实体书
";}
protected:
private:
};class  ProxyTaoBao : public Subject
{ 
public:virtual void SaleBook(){ Double11();RealSubject rs;rs.SaleBook();Double11();}void Double11(){ cout << "Double11 打折,半价" << endl;}
protected:
private:
};class  ProxyDangDang : public Subject
{ 
public:ProxyDangDang():m_s(NULL){ }void SetRealSubject(RealSubject *rs){ m_s = rs;}virtual void SaleBook(){ Double11();SetRealSubject(new RealSubject());m_s->SaleBook();}void Double11(){ cout << "Double11 打折,半价" << endl;}
protected:
private:RealSubject *m_s;
};int main()
{ cout << "当当代理:" << endl;ProxyDangDang *pdd = new ProxyDangDang;pdd->SaleBook();delete pdd;cout << "淘宝代理:" << endl;ProxyTaoBao *ptb = new ProxyTaoBao;ptb->SaleBook();delete ptb;      return 0;
}

输出如下:

当当代理:
Double11 打折,半价
卖实体书
淘宝代理:
Double11 打折,半价
卖实体书
Double11 打折,半价
C语言实现

实现功能:

实现不同网络协议的代理发送

实际业务端调用操作时才知道具体调用的网络协议(动态代理)

#include 
#include 
#include typedef struct CLIENT{ void (*request)();
}PcClient;typedef struct PROXY{ PcClient *client;	
}Proxy;void http_request()
{ printf("http request!!!
");return;
}void ftp_request()
{ printf("ftp request!!!
");return;
}void ntp_request()
{ printf("ntp request!!!
");return;
}Proxy *apply_proxy(void){ struct PROXY *tmp_proxy = NULL;struct CLIENT *tmp_client = NULL;tmp_proxy = (Proxy*)malloc(sizeof(Proxy));if(tmp_proxy == NULL){ return NULL;}tmp_client = (PcClient*)malloc(sizeof(PcClient));if(tmp_client == NULL){ return NULL;}tmp_proxy -> client = tmp_client;tmp_client -> request = NULL;return tmp_proxy;
}int main()
{ Proxy *proxy = NULL;proxy = apply_proxy();if(proxy == NULL) { return -1;}proxy -> client -> request = http_request;proxy -> client -> request();proxy -> client -> request = ftp_request;proxy -> client -> request();proxy -> client -> request = ntp_request;proxy -> client -> request();if(NULL != proxy) { free(proxy);proxy = NULL;}return 0;
}

输出如下:

http request!!!
ftp request!!!
ntp request!!!

更多相关:

  • 微信公众号:compassblog 欢迎关注、转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1、AOP概述 (1)、什么是 AOP AOP 为 Aspect Oriented Programming 的缩写,意为“面向切面编程”。AOP 是 OOP (面向对象)的延续,可以对业务的各个部分进行隔离,从而使得业务逻辑各...

  •   最近用Yii2.0框架做了个小项目,虽然项目本身业务逻辑不复杂,但是由于本身业务逻辑的特殊性,在上午9点到12点之间系统访问量会突然上升(浏览量和用户上传文件量)。导致系统单纯的部署在Apache下,支撑不了这么多的并发数;单独部署Nginx又由于用户频繁的提交数据,出现大量的502错误。然后又由于各方面的原因,就想通过Nginx...

  • 软件包如下:nginx-1.10.0.tar.gznginx-http-concat-master.zipngx_cache_purge-2.3.tar.gzopenssl-1.0.2h.tar.gzpcre-8.39.tar.gzzlib-1.2.8.tar.gz ngin部署方法:上面的安装包都存放在/apps/svr/soft目...

  • 知识点:   server的语法:   upstream语法:     upstream中192.168.100.1不是ip只是个标识,只要和下面的proxy_pass 对应即可。   基于IP的虚拟主机:     listen和server_name中多加上端口也没问题     listen可以监听在虚拟ip上面   代码: ups...

  • 编译Apache时要进行的设置./configure --enable-mods-shared="all proxy"1>修改 httpd.conf 文件中:LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_connect_module modules/mod_p...