【设计模式 04】代理模式

代理模式

代理模式( Proxy):为其他对象提供一种代理以控制对这个对象的访问。

参考:refactoringguru | proxy

什么是代理模式

有时候如果想要访问某个对象,但又没办法直接访问或不方便直接访问,可以使用代理模式,代理模式为想要访问的那个真实对象提供一种“替身”,将客户端直接对服务端的访问转换为客户端只与代理交互,由代理处理具体的和服务端的交互,代理模式有四种角色,分别是:

  1. 客户端
  2. 服务端
  3. 代理
  4. 抽象服务接口
UTOOLS1589610468487.png

代理中保留一个真实Server的对象,并且代理和真实Server实现同一个接口,这样对客户端来说Proxy就可以代替Server了,客户端想要调用Server的某个方法时,直接与代理交互,再由代理去调用Server的具体方法。

代理的优缺点

优点:

  • 你可以在客户端毫无察觉的情况下控制服务对象。
  • 如果客户端对服务对象的生命周期没有特殊要求, 你可以对生命周期进行管理。
  • 即使服务对象还未准备好或不存在, 代理也可以正常工作。
  • 开闭原则。 你可以在不对服务或客户端做出修改的情况下创建新代理。

缺点:

  • 代码可能会变得复杂, 因为需要新建许多类。
  • 服务响应可能会延迟。

代理的类型和使用场景

1. 远程代理

当我们需要一个远程对象时,可以通过一个本地代理去访问,所谓远程对象是指远程的资源,包括可能不同命名空间,不同机器的资源等,如果客户端直接访问远程资源,可能涉及到复杂的数据交互和传输,通过代理,我们可以把这些数据交互和传输的过程隐藏在代理里面,由代理去与远程资源交互,并返回客户端需要的数据,这样对客户端来说,访问远程资源就和访问本地资源一样了。以此简化客户端代码。

2. 虚拟代理

虚拟代理的主要作用是延迟初始化

如果你有一个偶尔使用的重量级服务对象,一直保持该对象运行会消耗系统资源, 时可使用代理模式.

你无需在程序启动时就创建该对象, 可将对象的初始化延迟到真正有需要的时候。

比如网站图片的加载, 真实的图片可能很大,如果在构造的时候就直接加载真实的图片,就会导致加载时间过长,所以可以使用代理,用很小的缩略图来代替真实的图片,直到用户点机缩略图时再异步的加载大图.

虚拟代理应该使用缓存避免重量级对象多次重复加载.

3. 保护代理

如果只有拥有特定权限的用户才能访问特定对象,就可以在代理中对用户权限进行判断,并根据权限返回不同的结果.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css 大于号 标签_CSS设计基础选择器篇

点击上方 Java项目学习 ,选择 星标 公众号重磅资讯、干货,第一时间送达前言:如果将CSS样式应用于特定的网页对象上,需要先找到目标元素。在CSS样式中执行这一任务的部分被称为选择器。1 标签选择器优点:为页面中同类型…

CSDN博客投票活动开始了

自己坚持写博客,一方面是为了将自己对知识点的理解做一个总结,另一方面也是因为自己看到了很多无私奉献分享自己知识的小伙伴们,因此自己也想像他们那样尽自己微薄之力把自己对某一知识点的理解分享给大家,或许算不上什么特高级的…

crontab 提示 command not found 解决方案

crontab 提示 command not found 解决方案 今天遇见一个问题,crontab的定时任务会报错:java command not found,但是手动执行脚本一直能成功。 猜想是环境变量的问题。 在crontab里添加个打印环境变量的任务: * * * * * echo $PAT…

java中文乱码decode_Java中文乱码处理

java编码转换过程我们总是用一个java类文件和用户进行最直接的交互(输入、输出),这些交互内容包含的文字可能会包含中文。无论这些java类是与数据库交互,还是与前端页面交互,他们的生命周期总是这样的:1、程序员在操作系统上通过编…

【设计模式 05】工厂方法模式

工厂方法模式 define an interface or abstract class for creating an object but let the subclasses decide which class to instantiate. 参考: refactoringguru | factory-methodjavatpoint | factory-method-design-pattern博客园| 工厂方法 简单工厂的问题 …

[C++]宏定义#define A B C

C关于宏定义的用法,有形如#define A B C的格式,此时B和C都是已知的字符串常量. 在宏定义中. 可以把两个常量字符串连在一起 如果#define A "a" 那么宏定义#define STRING A "bc" 就相当于 #define STRING "abc" 这里&…

LinkedList类源码浅析(二)

1、上一节介绍了LinkedList的几个基本的方法,其他方法类似,就不一一介绍; 现在再来看一个删除的方法:remove(Object o) remove方法接受一个Object参数,这里需要对参数做空与非空处理; 但是删除一个Object元…

【设计模式 06】原型模式(克隆??)

原型模式(clone?) Prototype pattern refers to creating duplicate object while keeping performance in mind. This type of design pattern comes under creational pattern as this pattern provides one of the best ways to create an object. 参考: tutori…

2016OSC源创会年终盛典-综合技术专场-张小刚

2019独角兽企业重金招聘Python工程师标准>>> 综合技术专场 讲师/SPEAKERS 张小刚 网易云负载均衡项目负责人 《网易蜂巢负载均衡技术实践》从网易蜂巢中的实践出发,分享网易蜂巢负载均衡服务从无到有,从私有云到公有云过程中的技术实践。重点…

python策略模式包含角色_详解Python设计模式之策略模式

虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用。《设计模式:可复用面向对象软件的基础》一书中有 23 个模式,其中有 16 个在动态语言中“不见了,或者简化了”。1、策略模式概述策略模式:定义…

mysql 日期

数据类型 数据类型格式date YYYY-MM-DD datetime YYYY-MM-DD HH:MM:SS timestamp YYYY-MM-DD HH:MM:SS year YYYY 或 YY 具体实现的函数 1、now() 返回当前的日期和时间 SELECT NOW(); 2、curdate() 返回当前的日期 SELECT CURdate(); 3、curtime()返回当…

【Go】panic: reflect: call of reflect.Value.FieldByName on ptr Value

产生原因 调用 FieldByName()方法时,调用者与预期类型不相符。 // 错误代码 func setNewArticleInfoToCache(article *Article) {fields : []string{"Title", "Abstract", "ID", "AuthorID", "CreateTime",}im…

超完整的 Chrome 浏览器客户端调试大全

2019独角兽企业重金招聘Python工程师标准>>> 引言 “工欲善其事,必先利其器” 没错,这句话个人觉得说的特别有道理,举个例子来说吧,厉害的化妆师都有一套非常专业的刷子,散粉刷负责定妆,眼影刷负…

PHP 获取服务器详细信息【转】

碰到此问题,做下记录 获取系统类型及版本号: php_uname() (例:Windows NT COMPUTER 5.1 build 2600)只获取系统类型: php_uname(s) (或&#xff1…

HIVE攻略 JFK_Hive安装及使用攻略

目录Hive的安装Hive的基本使用:CRUDHive交互式模式数据导入数据导出Hive查询HiveQLHive视图Hive分区表1. Hive的安装系统环境装好hadoop的环境后,我们可以把Hive装在namenode机器上(c1)。hadoop的环境,请参考:让Hadoop跑在云端系列文章&#…

MySQL 为什么用索引,为什么是 B+树,怎么用索引

MySQL 索引 A database index is a data structure that improves the speed of operations in a table. Indexes can be created using one or more columns, providing the basis for both rapid random lookups and efficient ordering of access to records. 为什么需要索…

页面加载完毕执行多个JS函数

通常我们需要在打开页面时加载脚本,这些脚本必须在页面加载完毕后才可以执行,因为这时候DOM才完整,可以利用window.onload确保这一点,如:window.οnlοadfirstFunction;这脚本的意思是在页面完毕后执行firstFunction函…

Servlet 生命周期、工作原理

Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁。init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器&…

【Go 并发控制】上下文 context 源码

Context 在 Go 服务中,往往由一个独立的 goroutine 去处理一次请求,但在这个 goroutine 中,可能会开启别的 goroutine 去执行一些具体的事务,如数据库,RPC 等,同时,这一组 goroutine 可能还需要…

js设置全局变量ajax中赋值

js设置全局变量,在ajax中给予赋值赋值不上问题解决方案 方案一、 //在全局或某个需要的函数内设置Ajax异步为false,也就是同步. $.ajaxSetup({async : false}); //然后再进行你的Ajax操作 $.post(地址, 参数, function(data, status) { if (status &q…