代理模式

    代理要做的:控制和管理访问。

 

    以远程代理为例,用Java自带的RMI实现。
1.先浏览和了解一下RMI吧
2.把本地需要被代理的类转换成远程服务,提供一些可以被远程调用的方法。
3.用RMI,创建一个能和远程对象沟通的代理。

代理模式:为另一个对象提供一个替身或占位符以控制对这个对象的访问。使用代理模式创建代表(representative)对象,让代表对象控制某对象的访问,被代理的对象可以是远程对象(远程对象),创建开销大的对象(虚拟对象)或者是需要安全控制的对象(保护代理)。

类图表述:Subject为RealSubject和Proxy提供了接口,通过实现同一接口,Proxy在RealSubject出现的地方取代它。RealSubject是真正做事的对象,它是被proxy代理和控制访问的对象。Proxy持有RealSubject的引用。客户和RealSubject的交互都必须通过Proxy,因为Proxy和RealSubject实现相同的接口,所以任何用到RealSubject的地方,都可以用Proxy取代。Proxy也控制了对RealSubject的访问。

 

虚拟代理:(准备虚拟代理Virtual Proxy)控制访问实例化开销大的对象。

 

代理和装饰者的意图:
    代理的意图在于作为真正主题的替身,保护对象避免不想要的访问,避免在加载大对象的过程中GUI会挂起,或者隐藏主题在远程运行的事实等。
    装饰者:只能装饰点缀,从来不会实例化任何东西。

 

保护代理
    Java在java.lang.reflect包中有自己的代理支持,利用这个包你可以在运行时动态地创建一个代理类,实现一个或多个接口,并将方法的调用转发到你所指定的类。因为实际的代理类是在运行时创建的,我们称这个Java技术为动态代理。
    创建Java API的动态代理:
1.创建两个InvocationHandler
    InvovationHandler实现了代理的行为。Java负责创建真实代理类和对象,我们只需要提供在方法调用发生时知道做什么的handler。
2.写代码创建动态代理:
    利用适当的代理包装主题对象。
    动态代理之所以被称为动态,是因为运行时才将它的类创建出来。代码开始执行时,还没有proxy类,它是根据需要从你传入的接口集中创建的。

 

    InvocationHandler根本就不是proxy,他只是一个帮助proxy的类,proxy会把调用方法转发给他处理。Proxy本身是利用静态的Proxy.newProxyInstance()方法在运行时动态地创建的。
    Proxy.isProxyClass()此方法可以判断一个类是不是代理类。

 

写在最后:
    代理模式有许多变体,例如:缓存代理、同步代理、防火墙代理和写入时复制代理。
    Java内置的代理支持,可以根据需要动态建立代理,并将所有调用分配到所选的处理器Handler

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值