设计模式--代理模式--学习笔记第一发

代理模式详解

定义

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

模式结构和说明

这里写图片描述

说明:
Proxy:
代理对象,
实现与具体的目标对象一样的接口,这样就可以使用代理来代替具体的目标对象
保存一个指向具体对象的引用,可以再需要的时候调用具体的目标对象
可以控制对具体目标对象的访问,并可能负责创建和销毁它
Subject:
目标接口 定义代理和具体目标对象的接口,这样就可以在任何使用具体目标对象的地方使用代理.

realSubject:
具体的目标对象,真正实现目标接口的要求的功能.

代理模式的功能:

代理模式是通过创建一个代理对象,用这个代理对象去代表真实的对象,客户端得到这个代理对象过后,对客户端没有什么影响,就跟得到了真实对象一样来使用。
当客户端操作这个代理对象的时候,实际上功能最终还是会由真实的对象来完成,只不过是通过代理操作的,也就是客户端操作代理,代理操作真正的对象。
正是因为有代理对象夹在客户端和被代理的真实对象中间,相当于一个中转,那么在中转的时候就有很多花招可以玩,比如:判断一下权限,如果没有足够的权限那就不给你中转了,等等。

代理的分类

事实上代理又被分成多种,大致有如下一些:
• 虚代理:根据需要来创建开销很大的对象,该对象只有在需要的时候才会被真正创建
• 远程代理:用来在不同的地址空间上代表同一个对象,这个不同的地址空间可以是在本机,也可以在其它机器上,在Java里面最典型的就是RMI技术
• copy-on-write代理:在客户端操作的时候,只有对象确实改变了,才会真的拷贝(或克隆)一个目标对象,算是虚代理的一个分支
• 保护代理:控制对原始对象的访问,如果有需要,可以给不同的用户提供不同的访问权限,以控制他们对原始对象的访问
• Cache代理:为那些昂贵的操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果
• 防火墙代理:保护对象不被恶意用户访问和操作
• 同步代理:使多个用户能够同时访问目标对象而没有冲突
• 智能指引:在访问对象时执行一些附加操作,比如:对指向实际对象的引用计数、第一次引用一个持久对象时,将它装入内存等
在这些代理类型中,最常见的是:虚代理、保护代理、远程代理和智能指引这几种。本书主要讨论和示例了虚代理和保护代理,这是实际开发中使用频率最高的。
对于远程代理,没有去讨论,因为在Java中,远程代理的典型体现是RMI技术,要把远程代理讲述清楚,就需要把RMI讲述清楚,这不在本书讨论范围之内。
对于智能指引,基本的实现方式和保护代理的实现类似,只是实现的具体功能有所不同,因此也没有具体去讨论和示例。
具体目标和代理的关系
从代理模式的uml图来看,有一个具体的目标类就有一个代理类,其实不是.如果代理类能完全通过接口来操作它所代理的对象,那么代理对象就不需要知道具体的目标对象,这样就无需为每一个具体的目标类都创建一个代理类了.
但是如果代理类必须要实例化它所代理的目标对象,那么代理类就必须知道具体被代理的对象.

代理模式调用时序:

这里写图片描述

保护代理

  保护代理是一种控制对原始对象访问的代理,多用于对象应该有不同的访问权限的时候。保护代理会检查调用者是否具有请求所必需的访问权限,如果没有相应的权限,那么就不会调用目标对象,从而实现对目标对象的保护。

Java中的代理

Java对代理模式提供了内建的支持,在java.lang.reflect包下面,提供了一个Proxy类和一个InvocationHandler接口.前面我们自己实现的代理通常称为静态代理.这种实现方式有一个较大的缺点就是如果Subject接口发生变化了,那么代理类和目标对象都要变化.不是很灵活,而是用java内建的则没有这个问题.
通常把使用Java内建的对代理模式支持的功能来实现的代理称为Java的动态代理。动态代理跟静态代理相比,明显的变化是:静态代理实现的时候,在Subject接口上定义很多的方法,代理类里面自然也要实现很多方法;而动态代理实现的时候,虽然Subject接口上定义了很多方法,但是动态代理类始终只有一个invoke方法。这样当Subject接口发生变化的时候,动态代理的接口就不需要跟着变化了
Java的动态代理目前只能代理接口,基本的实现是依靠Java的反射机制和动态生成class的技术,来动态生成被代理的接口的实现对象。具体的内部实现细节这里不去讨论。如果要实现类的代理,可以使用cglib(一个开源的Code Generation Library)。

代理模式的优缺点

代理模式在客户和被客户访问的对象之间,引入了一定程度的间接性,客户是直接使用代理,让代理来与被访问的对象进行交互。不同的代理类型,这种附加的间接性有不同的用途,也就是有不同的特点:
• 远程代理:隐藏了一个对象存在于不同的地址空间的事实,也即是客户通过远程代理去访问一个对象,根本就不关心这个对象在哪里,也不关心如何通过网络去访问到这个对象,从客户的角度来讲,它只是在使用代理对象而已。
• 虚代理:可以根据需要来创建“大”对象,只有到必须创建对象的时候,虚代理才会创建对象,从而大大加快程序运行速度,并节省资源。通过虚代理可以对系统进行优化。
• 保护代理:可以在访问一个对象的前后,执行很多附加的操作,除了进行权限控制之外,还可以进行很多跟业务相关的处理,而不需要修改被代理的对象。也就是说,可以通过代理来给目标对象增加功能。
• 智能指引:跟保护代理类似,也是允许在访问一个对象的前后,执行很多附加的操作,这样一来就可以做很多额外的事情,比如:引用计数等。

代理模式的本质

代理模式的本质:控制对象访问。
代理模式通过代理目标对象,把代理对象插入到客户和目标对象之间,从而为客户和目标对象引入一定的间接性,正是这个间接性,给了代理对象很多的活动空间,代理对象可以在调用具体的目标对象前后,附加很多操作,从而实现新的功能或是扩展目标对象的功能,更狠的是,代理对象还可以不去创建和调用目标对象,也就是说,目标对象被完全代理掉了,或是被替换掉了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值