代理模式
- 背景
- 概述
- 模式结构
- 代码实现
- 特点
- 应用场景
背景
在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。
通过引入一个新的对象来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通过引入代理对象来间接访问一个对象,这就是代理模式的动机。
概述
代理模式(Proxy Pattern) :给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy或Surrogate,它是一种对象结构型模式。
模式结构
代理模式包含如下角色:
Subject: 抽象主题角色
抽象主题角色声明了真实主题和代理主题的共同接口,实现了调用方和服务方的解耦。
Proxy: 代理主题角色
代理主题角色内部包含对真实主题的引用,从而可以在任何时候操作真实主题对象。
RealSubject: 真实主题角色
真实主题角色定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的方法。
代码实现
//抽象系统类 class AbstractCommonInterface{ public: virtual void run() = 0; }; class MyFunc :public AbstractCommonInterface{ public: virtual void run(){ cout << "run..." << endl; } }; class MrFuncProxy:public AbstractCommonInterface{ public: MyFunc*pFunc; string mUserInfo; public: MrSystemProxy(string userInfo){ this->mUserInfo = userInfo; pFunc = new MyFunc; } ~MyFuncProxy(){ if (NULL != pFunc) { delete pFunc; } } virtual void run(){ if (checkUserInfo()){ cout << "user info is right." << endl; this->pFunc->run(); } else{ cout << "error." << endl; } } }; void ProxyFunc() { MyFuncProxy* proxy = new MyFuncProxy("root,123"); proxy->run(); delete proxy; proxy = new MyFuncProxy("admin,123"); proxy->run(); delete proxy; }
特点
优点
代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
保护代理可以控制对真实对象的使用权限。
缺点
额外增加了代理层,可能造成请求的请求响应变慢。
需要额外增加代理层的实现逻辑,可能会比较复杂。
应用场景
图片代理
在Web中浏览大图一般使用图片代理实现,即用户访问某大图时不时直接加载该图片,这样会很消耗网络带宽,而是采用先向客户端浏览器加载一个小图,然后在后台加载大图,这样可以大幅度提升用户体验。
远程代理
远程代理可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。
虚拟代理
虚拟代理模式是一种内存节省技术,那些占用大量内存或处理复杂的对象将推迟到使用它的时候才创建。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
使用canvas做纯色或渐变色图片优化 img图片拉伸
原文链接:使用canvas做纯色或渐变色图片优化 img图片拉伸 基本思想是对于简单的纯色或者渐变色, 可以使用canvas画出来, 然后导出url, 再在img中缩放拉伸 下面窄的是canvas画的, 理论上只需要画一个像素宽就行了, 下面是img标签渲染的, 拉伸后也不会有模糊, 这种方式可能节省不少流量, 而且加载速度也会快一些, 主要是在一些大型活动中使用, 不过坏处就是必须图像不能太复杂, 不然不太好画 img标签的大小, 最后在外面包一层div, 通过控制外层div的大小来控制img的大小, 而且div可以通过padding实现指定比例的效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <...
- 下一篇
缩小版雪花算法的实现与多线程并发测试
我们设计数据表的时候,一般都会有ID字段,ID的生成方法有多种,比如数据库自增,UUID,雪花算法等。 考虑到以后数据的增长,分库分表,分布式等要求,我们选择雪花算法来生成ID。 开发Web系统需要后端跟前端交互,前端JavaScript支持的最大整型是53位,超过53位会丢失精度,原版的雪花算法会超过53位,我们使用缩小版的雪花算法,把位数减小到53位。 原版Snowflake算法的极限是每毫秒的每一个节点生成4059个id值,也就是说每毫秒的极限是生成023*4059=4 152 357个id值,缩小后极限是每秒生成15*131071=1 966 065个分布式id,够我们在开发里面的日常使用了。 package cn.gintone.asso.util; /** * @description:缩小版的雪花算法 * @author:Elon He * @create:2020-10-06 */ public class SnowflakeMini { /** * 开始时间截 (1970-01-01) */ private final static long ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7设置SWAP分区,小内存服务器的救世主
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS关闭SELinux安全模块
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境