代理模式

设计模式GOF23之第二回

﹥>﹥吖頭↗ 提交于 2019-12-23 07:53:46
1. 概述 结构型模式的作用:从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题。 2. 适配器模式(Adapter) 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。 常见的的使用,字节流转字符流就是使用适配器模式。 java.io.InputStreamReader(InputStream) java.io.OutputStreamWriter(OutputStream) 3. 代理模式(Proxy) 通过代理,控制对对象的访问! 使对象专注于核心逻辑的处理。 可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。(即:AOP的微观实现!) AOP(Aspect Oriented Programming面向切面编程)的核心实现机制!实现了横向,跨类的代码共享。 应用场景: 安全代理:屏蔽对真实角色的直接访问。 远程代理:通过代理类处理远程方法调用(RMI) 延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象。 分类: 静态代理(静态定义代理类) 动态代理(动态生成代理类) JDK自带的动态代理 javaassist字节码操作库实现 CGLIB ASM(底层使用指令,可维护性较差) 静态代理 动态代理 JDK自带的动态代理 java.lang

Apache 、Nginx 、Squid 的区别

醉酒当歌 提交于 2019-12-22 22:20:56
一、Apache: Apache 是一个优秀的开放源码的网页服务器,第一款web服务器端软件。但对于那些需要更强大的Web应用服务器(比如大小、可定制、响应速度、可扩展性等方面)的人而言,Apache明显不符合他们的要求,同类替代软件有Lighttpd,Nginx,kangle,Boa,Jigsaw等。 二、Squid: Squid是一个缓存Internet 数据的软件,其接收用户的下载申请,并自动处理所下载的数据。当一个用户想要下载一个主页时,可以向Squid 发出一个申请,要Squid 代替其进行下载,然后Squid 连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid 把保存的备份立即传给用户,使用户觉得速度相当快。Squid 可以代理HTTP、FTP、GOPHER、SSL和WAIS等协议并且Squid 可以自动地进行处理,可以根据自己的需要设置Squid,使之过滤掉不想要的东西。 (1)工作流程 当代理服务器中有客户端需要的数据时: 客户端向代理服务器发送数据请求; 代理服务器检查自己的数据缓存; 代理服务器在缓存中找到了用户想要的数据,取出数据; 代理服务器将从缓存中取得的数据返回给客户端。 当代理服务器中没有客户端需要的数据时: 客户端向代理服务器发送数据请求; 代理服务器检查自己的数据缓存;

《JAVA与模式》之代理模式

旧巷老猫 提交于 2019-12-22 18:42:12
代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。 代理模式的结构   所谓代理,就是一个人或者机构代表另一个人或者机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。   代理模式类图如下:      在代理模式中的角色:   ●   抽象对象角色: 声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。   ●   目标对象角色: 定义了代理对象所代表的目标对象。   ●   代理对象角色: 代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。 源代码   抽象对象角色 public abstract class AbstractObject { //操作 public abstract void operation(); }   目标对象角色 public class RealObject extends AbstractObject { @Override public void operation() { //一些操作 System.out

java的动态代理

左心房为你撑大大i 提交于 2019-12-22 16:54:19
1. 什么是动态代理 代理模式是为了提供额外或不同的操作,而插入的用来替代”实际”对象的对象,这些操作涉及到与”实际”对象的通信,因此代理通常充当中间人角色。Java的动态代理比代理的思想更前进了一步,它可以动态地创建并代理并动态地处理对所代理方法的调用。在动态代理上所做的所有调用都会被重定向到单一的 调用处理器 上,它的工作是揭示调用的类型并确定相应的策略。 大道理上讲代理是一种软件设计模式,目的地希望能做到代码重用。具体上讲,代理这种设计模式是通过不直接访问被代理对象的方式,而访问被代理对象的方法。这个就好比 商户---->明星经纪人(代理)---->明星这种模式。我们可以不通过直接与明星对话的情况下,而通过明星经纪人(代理)与其产生间接对话。 2. 代理的使用场景 (1)设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the code is really like shit),这时就很难去下手修改代码,那么这时我们就可以通过代理对类进行增强。 (2)我们在使用RPC框架的时候,框架本身并不能提前知道各个业务方要调用哪些接口的哪些方法 。那么这个时候,就可用通过动态代理的方式来建立一个中间人给客户端使用,也方便框架进行搭建逻辑,某种程度上也是客户端代码和框架松耦合的一种表现。

深入了解代理模式

China☆狼群 提交于 2019-12-22 05:37:31
代理分为静态代理和动态代理,下面分别针对两种代理做一下介绍: 一、静态代理(静态织入的方式) 所谓静态代理是指,在程序运行前,由程序员创建或特定工具自动生成源代码并对其编译生成.class文件,通过代理类在不修改原有代码的前提下增加一些新功能,是开闭原则(Open for Extension, Closed for Modification)最典型的实践。 二、动态代理 动态代理则可以简单地为各个主题类分别生成代理类,共享“预处理,后处理”功能,这样可以大大减小程序规模,这也是动态代理的 一大 亮点。 在动态代理中,代理类是在运行时期生成的。因此,相比静态代理,动态代理可以很方便地对委托类的相关方法进行统一增强处理,如添加方法调用次数、添加日志功能等等。 动态代理主要分为JDK动态代理和cglib动态代理两大类。 1、实现动态代理的关键技术是反射;   2、代理对象是对目标对象的增强,以便对消息进行预处理和后处理;   3、InvocationHandler中的invoke()方法是代理类完整逻辑的集中体现,包括要切入的增强逻辑和进行反射执行的真实业务逻辑;   4、使用JDK动态代理机制为某一真实业务对象生成代理,只需要指定目标接口、目标接口的类加载器以及具体的InvocationHandler即可。   5、JDK动态代理的典型应用包括但不仅限于AOP、RPC、Struts2

npm 走 privoxy 代理经常出现 shasum check failed 的解决办法

爷,独闯天下 提交于 2019-12-22 02:14:23
今天在下载一个比较大的项目,经常 shasum check failed ,太烦了,于是想切淘宝源,分别尝试 nrm 切换和传递 --registry ,结果都出现 Unexpected end of JSON input 错误。这是比较奇怪的,从内容上看起来是 JSON 数据没有传完。结合以前 SwitchyOmega 走 privoxy 访问网页经常有资源被block的经验,怀疑是 privoxy 自带的过滤功能的问题。 privoxy 的主配置是在 /etc/privoxy/config 内,查找发现如下几个配置项: 350行 actionsfile ; 390行 filterfile ; 785行 toggle ; 前两项的 Effect if unset 是说不设置则不执行 actions 或不应用内容过滤规则, toggle 项的配置则说设为 0 会以 toggled off 模式运行,广告拦截和内容过滤都会被禁用。 那么把 toggle 设为 0 ,保守起见同时注释掉 actionsfile 和 filterfile 的设置。 应用以上更改后,感觉是有点作用的, install 小项目一次过了,切换淘宝源也很顺利,不过在一次大规模的 install 中还是出现了 shasum check failed 错误,但频率没那么高了。 因此我暂时当作是一种疑似解决方案。 本文

什么是跨域

为君一笑 提交于 2019-12-21 18:56:22
1.同源策略 是浏览器的安全策略 协议名、域名、端口号必须一致 2.跨域 违背了同源策略就会产生跨域 3.解决跨域 jsonp cors 服务器代理模式 第一步 创建script标签 var script = docuemnt.createElement("script") 第二步 设置回调函数 fuction getData(data){ //数据请求回来会被触发的函数 consol.log(data) } 第三步 设置script标签的src属性 设置请求地址 script.src = "http://localhost:3000?callback=getData" 第四步 让script 标签生效 document.body.appendChild(script) 来源: 51CTO 作者: 喝醉的熊 链接: https://blog.51cto.com/13550695/2460639

Java动态代理全面分析

ぃ、小莉子 提交于 2019-12-21 17:13:29
代理模式 解说:给某一个对象提供一个代理,并由代理对象控制对原对象的引用; 代理模式需要以下几个角色: 1 主题:规定代理类和真实对象共同对外暴露的接口; 2 代理类:专门代理真实对象的类; 3 真实对象:需要被代理的对象; 代理解决的主要的业务就是需要在 真实对象的某个接口 前后处理一些事情,框架中多会用到这种功能,比如 打日志、记录时间等 静态代理 静态代理是指自己动手编写代码实现代理类; 优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。 缺点:每一个真实对象都需要一个具体的代理类,不能做到可重用; 静态代理比较简单,下边用代码来具体说明; 主题接口:IAnimal public interface IAnimal { /** * 动物叫 */ void bark(); } 真实对象:Dog public class Dog implements IAnimal { private String name; public Dog(String name) { this.name = name; } @Override public void bark() { System.out.println(this.name + " bark:wang wang wang ... "); } } 代理:DogProxy public class

SIP协议整理

旧街凉风 提交于 2019-12-21 07:15:56
  本文记录开发、实现IMS项目时,整理的SIP协议基础知识;若有侵权,请告之。 SIP协议 1. SIP 协议简介 SIP是一个应用层的控制协议,可以用来建立、修改、和终止多媒体会话(或者会议)例如Internet电话。SIP也可以邀请参与者参加已经存在的会话,比如多方会议。媒体可以在一个已经存在的会话中方便的增加(或者删除)。SIP显示的支持名字映射和重定向服务,这个用于支持个人移动业务-用户可以使用一个唯一的外部标志而不用关系他们的实际网络地点。SIP在建立和维持终止多媒体会话协议上,支持5个方面: 用户定位 :检查终端用户的位置,用于通讯。 用户有效性 :检查用户参与会话的意愿程度。 用户能力 :检查媒体和媒体的参数。 建立会话 :”ringing”,建立会话参数在呼叫方和被叫方。 会话管理 :包括发送和终止会话,修改会话参数,激活服务等等。 SIP不是一个垂直集成的通讯系统。SIP可能叫做是一个部件更合适,它可以用作其他IETF协议的一个部分,用来构造完整的多媒体架构。比如,这些架构将会包含实时数据传输协议(RTP)(RFC1889)用来传输实时的数据并且提供QoS反馈,实时流协议(RSTP)(RFC2326)用于控制流媒体的的传输,媒体网关控制协议(MEGACO)(RFC3015)用来控制到公共电话交换网(PSTN)的网关,还有会话描述协议(SDP)(RFC2327

Java反射机制专题

最后都变了- 提交于 2019-12-21 04:37:38
·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法 ·Java反射机制提供的功能   在运行时判断任意一个对象所属的类   在运行时构造任意一个类的对象   在运行时判断任意一个类所具有的成员变量和方法   在运行时调用任何一个对象的成员变量和方法   生成动态代理 ·反射相关的主要API:   java.lang.Class:代表一个类   java.lang.reflect.Method:代表类的方法   java.lang.reflect.Field:代表类的成员变量   java.lang.reflect.Constructor:代表类的构造方法 Class类 在Object类中定义了以下的方法,此方法将被所有子类继承:   public final Class getClass() 以上的方法返回值的类型是一个Class类,此类事Java反射的源头,实际上所谓反射从程序的运行结果来看也很好理解,即:可以通过对象反射求出类的名称。 ·对照镜子后可以得到的信息:某个类的属性、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Class对象包含了特定某个类的有关信息。