设计模式 之美 -- 代理模式
文章目录
- 1. 解决问题
- 2. 应用场景
- 1. 业务系统的非功能性开发
- 2. 代理模式在RPC、缓存中的应用
- 3. 实现
- C++实现
- C语言实现
1. 解决问题
客户端和目标对象之间需要进行交互,此时客户端类和目标对象类相关操作之间的逻辑如果交合在一起,会导致客户端和目标对象模块耦合度升高,后期扩展客户端的功能时,则需要修改两者的源代码。
这样的架构设计在系统更加庞大(网络通信链路庞杂,功能增删频繁)的场景下,维护成本极高。
所以,推出代理模式,在客户端和目标对象之间增加代理类,客户端仅需要调用代理类相关的接口,即可完成对目标对象的操作;当客户端调用新的对象时,仅需要扩展代理类的接口即可。
2. 应用场景
1. 业务系统的非功能性开发
监控、统计、鉴权、事务、幂等、日志 这一些附加功能
通过代理模式,将其与业务功能解耦,在代理类中同一处理,程序员仅需关注业务方面的开发,附加功能的调用仅需通过代理类提供的封装好的接口即可。
如:Spring AOP切面 即为代理模式
2. 代理模式在RPC、缓存中的应用
通过远程代理,将网络通信、数据编解码等细节隐藏起来。客户端使用RPC时就像使用本地函数一样,无需了解和服务器的交互细节。
RPC服务的开发者也只需开发业务逻辑,就像开发本地函数一样,不需要关注跟客户端的交互细节。
代理模式在缓存中应用,对于需求中开发一个接口请求的缓存功能,支持缓存、支持实时查询两个接口。此时,随着需求的增加,每个需要都需要增加以上两个接口,这显著增加了开发成本,且会让代码臃肿。
此时增加代理模式,使用动态代理的方式维护 缓存功能的两个接口:支持缓存和支持查询。
3. 实现
C++实现
实现功能:
出版社:被代理对象,要卖书
淘宝、当当网:代理对象
客户端通过当当网进行买书。
#include <iostream>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 << "卖实体书\n";}
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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>typedef struct CLIENT{void (*request)();
}PcClient;typedef struct PROXY{PcClient *client;
}Proxy;void http_request()
{printf("http request!!!\n");return;
}void ftp_request()
{printf("ftp request!!!\n");return;
}void ntp_request()
{printf("ntp request!!!\n");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!!!
设计模式 之美 -- 代理模式相关推荐
- 设计模式学习之代理模式学习(一)
设计模式学习之代理模式学习(一) 关于设计模式想必学习过Java语言的人都知道吧,当时对其进行深入学习的的人应该不是很多.在我看来设计方面的知识相比于框架应用配置等知识要有意思的多,并且设计模式的对一 ...
- 设计模式之静态代理模式实战
转载自 设计模式之静态代理模式实战 静态代理模式很简单,代理类和实现类都实现相同的接口,然后通过代理类来调用实现类的方法. 如我们想保存用户信息之前打印用户信息,或者保存用户信息之后把这些信息缓存下来 ...
- 设计模式之蝉——代理模式上中
代理模式的扩展 1 普通代理 :这种代理就是客户端只能访问代理角色,而不能访问真实角色.与设计模式之蝉--代理模式上 片基本差不多. (1)Subject抽象主题角色: (2)RealSubject具 ...
- 每日一个设计模式之【代理模式】
文章目录 每日一个设计模式之[代理模式] ☁️前言
- 《设计模式系列》- 代理模式
有情怀,有干货,微信搜索[三太子敖丙]关注这个有一点点东西的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文 ...
- 设计模式之略见一斑(代理模式Proxy)
普通对象所需要完成的任务就是通过公共接口为外界提供自己所承诺的服务.然而,有时候合法的对象可能会因为各种原因而无法完成自己常规的任务.尤其是当对象需要长时候才能载入内存.对象正运行在另一台计算机上或者 ...
- 大话设计模式C++版——代理模式
本篇開始前先发个福利,程杰的<大话设计模式>一书高清电子版(带文件夹)已上传至CSDN,免积分下载. 下载地址:http://download.csdn.net/detail/gu ...
- Java24种设计模式(第二种)--代理模式(Proxy Pattern)
Java24种设计模式 (第二种) 一.代理模式(Proxy Pattern) 模式逻辑: 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事 ...
- 23种java设计模式详解-代理模式
什么是代理模式: Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问.所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类, ...
最新文章
- jquery+javascript触发a标签的点击事件
- linux下调试thread 类_在 RISC-V 芯片 GD32V 上运行 RT-Thread
- redis基本类型以及优点特性
- [上下界网络流][二分] Bzoj P2406 矩阵
- Servlet是否单例?
- 拳王公社:缺流量难变现?文库引流让你0成本可获5000精准粉!
- mex2 Inputs and Outputs
- gitbook mac 版本的安装
- PCB特征阻抗计算工具——Polar SI9000软件下载与安装教程
- 3.3 高斯法求逆矩阵
- 数据结构习题——第一章 绪论
- Linux/Unix下Shell快捷键操作大集合
- 京东自营售前客服考试
- 树莓派安装mplayer,并使用命令查看摄像头
- 递推算法6——逆推法之存取问题
- VScode受难记 - 0
- Python 处理POS标签
- JMETER解决测试结果乱码问题
- edge浏览器安装chrome插件
- 幸好有了这份“星级”的阿里面经!“穷苦乡村”小伙就得安于现状?(终获阿里Java开发P7岗)
热门文章
- C/C++中constkeyword
- usaco Ordered Fractions 顺序的分数(两种解法)
- linux wifi-tools,Linux下WiFi工具wireless_tools交叉编译,及其支持生成iwconfig使用的内核配置...
- 多个数字数组_三菱ST语言教学(2)——数组的使用
- 康复治疗学可以考计算机吗,【大揭秘】2018“人机对话”康复医学治疗技术专业技术资格考试...
- jquery控制只监听数字_jQuery老矣,尚能饭否
- java 逻辑校验工具_SpringBoot2.0实战(10)整合fluent-validator优雅业务校验
- mysql服务器端的参数有很多_但是对于大多数初学者来说_mysql优化的重要参数 key_buffer_size table_cache...
- 自然科学期刊能发表计算机论文吗,自然科学专业论文好发表吗?
- 使用Python,OpenCV,K-Means聚类查找图像中最主要的颜色