深入剖析代理模式

代理模式理解

为其他对象提供一种代理以控制这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。

为什么需要代理?

因为一个良好的设计不应该轻易的修改。这正是开闭原则的体现:一个良好的设计应该对修改关闭,对扩展开放。而代理正是为了扩展类而存在的。他可以控制对现有类(需要被代理的类)服务的访问,通俗的解释就是可以拦截对于现有方法的调用并做些处理。

在软件设计中,使用代理模式的意图很多,比如因为安全原因,需要屏蔽客户端直接访问真实对象;或者在远程调用中,需要使用代理类处理远程方法调用的技术细节(如:RMI);也可能是为了提升系统性能,对真实对象进行封装,从而达到延迟加载的目的。

静态代理模式中,为什么要强制代理主题与真实主题实现相同的接口?

代理模式针对相同的接口编程,

1)以达到透明地替换原来的对象。

2)保证了代理对象具有和被代理对象具有一样的契约。

3)针对接口编程,灵活性,好处是不言而喻的。

4)代理类代理目标对象,必须让客户端看代理类和目标对象是一样的。

代理模式应用的几种情况:

1)远程代理Remote Proxy

通过代理来表示另一个地址空间中的对象,使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。

2)虚代理Virtual Proxy

按需创建开销很大的对象。常用于延迟加载。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。

copy-on-write代理:是虚拟代理的一种,把赋值操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。

3)保护代理Protection Proxy

控制对原始对象的访问,在访问对象时可以附加一些操作。

4)智能指引Smart Reference

充当智能指针:能自动释放所引用的对象

总结

在客户端和目标对象之间增加了代理对象,中间加一层,解耦。代理类和目标对象实现同一接口,对外部提供统一的接口方法,而代理类在接口中实现对真实类的附加操作行为,从而可以在不影响外部调用情况下,进行系统扩展。

时间: 2024-10-25 16:17:16

深入剖析代理模式的相关文章

Java记录 -90- 静态代理模式深度剖析

代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理地下可以在客户端和目标对象之间起到中介的作用. 代理模式一般涉及到三个角色: 1.抽象角色:声明真实对象和代理对象的共同接口: 2.代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他操作,相当于对真实对象进行封装: 3.真实角色

设计模式剖析-面向模式编程

这是一篇不成形的论文,新项目开始了,先放水了.以前看设计模式相关的书籍,总是感觉记起来很吃力,当时理解了过后仍是忘记.康德在理性批评前言中有过大致如下的描述:如果我们做一件事情,一旦要达成目的,或是已经达成目的,却发现我们得推翻以前所有的建设而重新开始,对于这门学科,我们还远远没有找到一条可靠的道路.本文给出了设计模式的一个全新的分类视角,使记忆.理解都变得十分容易.我相信这是一条正确的道路.并提出了面向模式的程序设计概念.它融合了面向对象编程.泛型.面向方面编程.并为新模式的产生指明了道路.

Hadoop阅读笔记(七)——代理模式

关于Hadoop已经小记了六篇,<Hadoop实战>也已经翻完7章.仔细想想,这么好的一个框架,不能只是流于应用层面,跑跑数据排序.单表链接等,想得其精髓,还需深入内部. 按照<Hadoop阅读笔记(五)——重返Hadoop目录结构>中介绍的hadoop目录结构,前面已经介绍了MapReduce的内部运行机制,今天准备入手Hadoop RPC,它是hadoop一种通信机制. RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络

Spring框架_代理模式(静态代理,动态代理,cglib代理)

共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                                      用户库jar包,需要手动发布到tomcat. (每次新建项目) 3) 重新发布项目 * 配置文件错误 (web.xml / struts.xml /bean.xml /hibernate.xml / *.hbm.xml) 明确的提示 * 端口占用 * we

拦截器的设计思想——代理模式

代理模式:静态代理和动态代理 1.代理类和被代理类必须实现同一个借口 2.代理类和别代理类有一种关联关系 静态代理: 例如实现一个日志: //定义一个接口 public interface UserDao{ public void delete(); } //定义一个实现类 public class UserDaoImpl implements UserDao{ public void delete(){ System.out.pritln("成功删除"); } } //定义一个代理类

Java设计模式——代理模式

前言: 上一篇说到了策略模式.单类图上来说,它和本篇要说的代理模式还真是有些像似.都需要一个公共的接口,还有一些实现类.代理类(包装类)封装了一个接口对象,提供客户端调用.这些都很类似.不过,有一个细节需要我们注意一下,那就是这里的代理类也需要去继承这里的公共接口.而在策略模式中,包装类则不需要这么做. 概述: 代理模式就是定义一个原对象的代理对象,来帮助原对象和系统之外的业务作沟通.也就是说,如果我们不能直接或是不愿直接去使用原对象,那么我们就可以使用创建一个原对象的代理来进行操作. 本文链接

代理模式(Proxy)

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式一般涉及到的角色有 抽象角色:声明真实对象和代理对象的共工接口 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装. 真实角色:代理角色所代表的真实对

深刻理解代理模式在java中如何优化系统性能

最近参与实习公司的项目迭代,项目中需要实现系统的快速响应和大量数据处理.在不断的学习中获得一点儿心得,先记录下来.慢慢的修改! 关于代理模式的知识和简单应用之前的学习笔记中已经有记录了,可以复习一下.这里主要记录如何使用代理模式来实现延迟加载,进而提升系统系能和反应速度. 使用代理模式实现延迟加载的一个简单实例: 需求:项目中对系统的启动速度做了一定的要求 我们在系统首次加载时,因为不需要实际的数据来构造显示界面,这就为我们实现系统首次加载的快速响应提供了可能.在常规模式下,我们一般会在系统启动

使用反射机制调用属性和私有成员与代理模式的介绍

使用反射机制调用属性: 通过反射机制可以获得类的属性,获得到的属性同样的可以进行赋值.得值操作,调用getField方法并传递属性的名称可以获得[学Java,到凯哥学堂kaige123.com]指定的属性,调用getFields方法则可以获得全部属性,但是这种方式不能获得私有属性: 代码示例: Student类示例: 运行结果: 从运行结果可以看出只拿出了公开的属性,私有的属性拿不到. 使用反射机制调用私有成员: 1.调用私有属性 在反射机制里调用私有属性需要通过getDeclaredField