代理模式

控制对对象的访问——代理模式详解(静态代理和动态代理的区别以及联系)

孤者浪人 提交于 2019-11-28 01:59:31
目录 1. 前言 2. 代理模式详解 2.1 定义 2.2 普通代理模式类结构 2.3 普通代理模式的实现(静态代理) 3. JDK动态代理详解 3.1 JDK动态代理实现 3.2 方法调用流程图 3.3 动态代理和静态代理的区别 3.4 其他实现动态代理的方式 4. 总结 1. 前言 代理模式可以说是生活中处处可见。比如说在携程上定火车票,携程在这里就起到了一个代理的作用,比起我们在官网上或者直接去柜台订票,携程可以为用户提供更多人性化的选择。再比如代购,我自己的mbp就是委托别人从香港买回来的,那么那个代购人就相当于代理,免去了我来回的车费以及办签证的麻烦。直观的理解,代理是这么一个对象,我们可以把工作委托给它,由它帮我们去执行工作同时解决工作相关的各种麻烦,最后把工作成果交给我们。这样一来我们只需要关注问题的核心,并告知代理,而不需要为其他琐碎的细节操心,这正是代理模式最大的好处,让客户端专注于真正的事务处理。具体而言,代理模式分为静态代理和动态代理,它们的设计思想类似,实现却大相径庭。它们的实现方式以及它们的区别是面试时经常会被问到的。下面我们就来详细介绍它们。 2. 代理模式详解 2.1 定义 为另一个对象提供一个替身或占位符以控制对这个对象的访问 定义简单明了。但还是有些没有解释清楚的地方,控制对对象的访问是为了干什么?其实是为了对真实的业务方法作某种形式的增强

代理模式 (Proxy Pattern)

醉酒当歌 提交于 2019-11-28 01:59:16
代理模式的定义:为其他对象提供一种 代理 以控制对这个对象的访问。 对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行 创建和初始化。 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 抽象主题角色(Subject) :通过接口或抽象类声明真实角色实现的业务方法。 定义真实主题角色RealSubject 和代理角色Proxy共用的接口,这样就在任何使用RealSubject的地方都可以使 用Proxy。 代理角色(Proxy): :实现抽象主题角色,是真实主题角色的代理。代理角色对象内部含有对真实主题角色对象的引用,从而可以操作真实主题角色对象,同时代理角色对象提供与真实主题角色对象相同的接口以便在任何时刻都能代替真实主题角色对象。同时代理角色对象在执行真实主题角色对象操作时,可以附加其他的操作,相当于对真实主题角色对象进行封装。 真实主题角色 (RealSubject ):实现抽象主题角色,定义真实主题角色所要实现的业务逻辑,供代理角色调用。 代理模式分为静态代理、动态代理: 静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。 动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。

为其他对象提供一种代理以控制对这个对象的访问-代理模式

爷,独闯天下 提交于 2019-11-28 01:58:59
一、前言 在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户端和目标对象之间起到 中介的作用,并且可以通过代理对象去掉客户不能看到 的内容和服务或者添加客户需要的额外服务。 通过引入一个新的对象来实现对真实对象的操作或者将新的对 象作为真实对象的一个替身,这种实现机制即 为代理模式,通过引入代理对象来间接访问一 个对象,这就是代理模式的模式动机。 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 二、基本概念 代理模式(Proxy Pattern) :给某一个对象提供一个代 理,并由代理对象控制对原对象的引用。代理模式的英 文叫做Proxy或Surrogate,它是一种对象结构型模式。 代理模式包含三个角色: 抽象主题角色(Subject):通过接口或抽象类声明真实角色实现的业务方法。 代理主题角色(Proxy):实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。 真实主题角色(RealSubject):实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。 意图: 为其他对象提供一种代理以控制对这个对象的访问。 主要解决:

设计模式之代理模式

三世轮回 提交于 2019-11-28 01:37:30
概述   代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象. 代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问。 其实就是代理就是做到类似转发的功能,针对不同代理,转发的具体实现不同。这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法 代理模式的关键点是:代理对象与目标对象.代理对象是对目标对象的扩展,并会调用目标对象 解决问题   从原理知道他就是控制客户对一个对象的访问,它跟现实中的中介代理类似,只是作为代表做一些受理工作,真正执行的并不是它自己。比如买火车票,外面有很多火车票代理点,我们直接去代理点买票就好而不用跑到火车票买了(暂时不考虑网购哈)。 UML 1. 1静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类. 下面举个案例来解释: 模拟保存动作,定义一个保存动作的接口:IUserDao.java,然后目标对象实现这个接口的方法UserDao.java,此时如果使用静态代理方式,就需要在代理对象(UserDaoProxy.java)中也实现IUserDao接口.调用的时候通过调用代理对象的方法来调用目标对象. 需要注意的是,代理对象与目标对象要实现相同的接口

代理模式(Proxy Pattern)

十年热恋 提交于 2019-11-28 01:37:11
标签 :设计模式 模式简介   代理模式是一种 结构型模式 。使用一个代理类来调用真实类的请求。   代理可以提供延迟实例化,访问控制,等等功能。 UML类图 角色 抽象角色(Subject) :声明真实对象和代理对象的共同接口。 代理角色(Proxy) :代理对象角色 内部含有对真实对象的引用 ,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时, 附加其他的操作 ,相当于对真实对象进行封装。 真实角色(RealSubject) :代理角色所代表的真实对象,是我们最终要引用的对象。 分类   代理模式根据其目的和实现方式不同可分为很多种类,其中常用的几种代理模式简要说明如下: 远程代理(Remote Proxy)   给一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又称为大使(Ambassador)。 虚拟代理(Virtual Proxy)   如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。 保护代理(Protect Proxy)   控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。 缓冲代理(Cache Proxy)  

设计模式之代理模式

陌路散爱 提交于 2019-11-28 01:36:59
定义(百度百科): 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 UML类图: 具体代码: public class Client { public static void main(String[] args) { Subject realSubject = new RealSubject(); Proxy proxy = new Proxy(realSubject); proxy.request(); } } public class Proxy { Subject realSubject = null; Proxy(Subject realSubject) { this.realSubject = realSubject; } void request() { System.out.println("代理类"); realSubject.request(); } } public class RealSubject implements Subject { @Override public void request() { System.out.println("request"); } } public interface Subject { void

Java设计模式之代理模式

三世轮回 提交于 2019-11-28 01:36:45
代理模式 在代理模式(Proxy Pattern)中: ①一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 ②我们创建具有现有对象的对象,以便向外界提供功能接口。 介绍 作用: 为其他对象提供一种代理以控制对这个对象的访问, 举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接联系明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决.这就是代理思想在现实中的一个例子。 主要解决 :在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。 优点: 1、职责清晰  2、高扩展性  3、智能化。 缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。 一、静态代理 我们将创建一个SomeService接口和实现SomeService接口的实体类。ServiceProxy是一个代理类,减少ServiceSomeImpl对象加载的内存占用。proxyTest

java动态代理

假装没事ソ 提交于 2019-11-27 23:45:55
JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 按照代理的创建时期,代理类可以分为两种。 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 动态代理:在程序运行时,运用反射机制动态创建而成。 首先看一下静态代理: 1、Count.java package net.battier.dao; /** * 定义一个账户接口 * * @author Administrator * */ public interface Count { // 查看账户方法 public void queryCount(); // 修改账户方法 public void updateCount(); } 2、CountImpl.java package net.battier.dao.impl; import net.battier.dao.Count; /** * 委托类(包含业务逻辑) * * @author Administrator * *

HeadFirst 设计模式

 ̄綄美尐妖づ 提交于 2019-11-27 23:17:09
一、设计原则 封装变化 多用组合,少用继承 针对接口编程,不针对实现编程 为交互对象之间的松紧耦合设计而努力 对扩展开放,都修稿关闭 依赖抽象,不要依赖具体类 最少知识原则:之和朋友交谈 好莱坞原则:别找我,我会找你(由超类主控一切,当他们需要的时候,自然回去调用子类) 类应该只有一个改变的理由 二、设计模式 策略模式 定义算法族,分别封装起来,让他们之间可以互相替换,次模式让算法的变化独立于使用算法的客户 2. 观察者模式 在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新 3. 装饰者模式 动态的将责任附加到对象上。想哟啊扩展功能,装饰者提供有别于继承的另一种选择 要点: 继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式 在我们的设计中,应该允许行为可以被扩展,而无需修改现有的代码 组合和委托可用于在运行时动态地加上新的行为 除了继承,装饰者模式也可以让我们扩展行为 装饰者模式意味着一群装饰者类,这些类用来包装具体组件 装饰者类反应出被装饰者的组件类型(事实上,他们具有相同的类型,都是经过接口或继承实现) 装饰者可以被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的 可以用无数个装饰者包装一个组件 装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型

部分APP无法代理抓包的原因及解决方法

强颜欢笑 提交于 2019-11-27 23:12:09
引言 HTTP应用层的抓包已经成为日常工作测试与调试中的重要一环,最近接触新项目突然之间发现之前的抓包手段都不好使了,顿时模块与模块之间的前端与服务之间的交互都变成了不可见,整个人都好像被蒙住了眼睛。 其实自己也很早就发现平时使用的支付宝等APP使用Fiddler 或 Charles这类代理抓包软件默认情况下就无法抓取请求的,但使用Wireshark这类网卡抓包软件可以看到这些APP的流量,而已这些流量也表明这些APP使用的主要应用层协议仍然是HTTP(https),不过我们的代理抓包工具却失效了。如今终于在实际工作中遇到了,也不得不解决了,毕竟眼前有东西挡住会让我浑身不适。 代理抓包原理 为了弄明白为什么Fiddler 或 Charles对这些APP无效,我们有必要先了解代理抓包我原理(当然您不想了解也是完全可以的,直接看后面的 实际操作 就可以完成,原理分析什么的可以有兴趣随时回来看) Fiddler 或 Charles 这类使用的代理的抓包软件与Wireshark是完全不同的(Wireshark 使用的网卡数据复制,只要是经过指定网卡都会被抓取),其只能对使用代理的应用层网络协议生效,比如常见的HTTP(https),Websocket 。 这里以HTTP为例简单说明下 客户端需要完成一次HTTP请求,通常需要先找到服务器,客户端会根据http请求中url的主机名