首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

java动态署理模式初解

2012-08-25 
java动态代理模式初解package?proxypatternpublic?interface?Subject?...{??????public?void?dothing()}

java动态代理模式初解
package?proxypattern;
java动态署理模式初解
java动态署理模式初解java动态署理模式初解public?interface?Subject?...{
java动态署理模式初解??
java动态署理模式初解????public?void?dothing();
java动态署理模式初解}
真实角色,实现了Subject 的dothing()方法;

java动态署理模式初解package?proxypattern;
java动态署理模式初解
java动态署理模式初解java动态署理模式初解public?class?RealSubject?implements?Subject...{
java动态署理模式初解java动态署理模式初解???public?RealSubject()...{
java动态署理模式初解?????
java动态署理模式初解???}
java动态署理模式初解??
java动态署理模式初解java动态署理模式初解???public?void?dothing()...{
java动态署理模式初解???????System.out.println("Do?you?want?do.");
java动态署理模式初解???}
java动态署理模式初解}代理角色:
??
java动态署理模式初解package?proxypattern;
java动态署理模式初解
java动态署理模式初解java动态署理模式初解public?class?ProxySubject?implements?Subject...{
java动态署理模式初解????
java动态署理模式初解????public?RealSubject?realSubject;
java动态署理模式初解java动态署理模式初解????public?ProxySubject()...{
java动态署理模式初解????????
java动态署理模式初解????}
java动态署理模式初解????
java动态署理模式初解java动态署理模式初解????public?void?dothing()...{
java动态署理模式初解????????predothing();
java动态署理模式初解java动态署理模式初解????????if(realSubject==null)...{
java动态署理模式初解????????????realSubject=new?RealSubject();
java动态署理模式初解????????}
java动态署理模式初解????????realSubject.dothing();??//执行真实对象的dothing()方法
java动态署理模式初解????????afterdothing();
java动态署理模式初解????}
java动态署理模式初解????
java动态署理模式初解java动态署理模式初解????private?void?predothing()...{
java动态署理模式初解????????System.out.println("before?you?do?thing!");
java动态署理模式初解????}
java动态署理模式初解java动态署理模式初解????private?void?afterdothing()...{
java动态署理模式初解????????System.out.println("after?you?do?thing!");
java动态署理模式初解????}
java动态署理模式初解
java动态署理模式初解}


测试事例? ?? ?? ?? ???
java动态署理模式初解package?proxypattern;
java动态署理模式初解
java动态署理模式初解java动态署理模式初解public?class?ProxyTest?......{
java动态署理模式初解
java动态署理模式初解java动态署理模式初解????/**?*//**?*//**?*//**
java动态署理模式初解?????*?@param?args
java动态署理模式初解?????*/
java动态署理模式初解java动态署理模式初解????public?static?void?main(String[]?args)?......{
java动态署理模式初解????????
java动态署理模式初解????????Subject?sub=new?ProxySubject();
java动态署理模式初解
java动态署理模式初解????????sub.dothing();
java动态署理模式初解????}
java动态署理模式初解
java动态署理模式初解}

4.如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,
一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?
这个问题可以通过Java的动态代理类来解决5.如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作
为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事
先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决

package?dynamicproxy;
java动态署理模式初解
java动态署理模式初解import?java.lang.reflect.InvocationHandler;
java动态署理模式初解import?java.lang.reflect.Method;
java动态署理模式初解
java动态署理模式初解java动态署理模式初解public?class?DynamicSubject?implements?InvocationHandler?...{
java动态署理模式初解????
java动态署理模式初解java动态署理模式初解public?DynamicSubject()?...{
java动态署理模式初解????????
java动态署理模式初解????????
java动态署理模式初解????}
java动态署理模式初解????
java动态署理模式初解java动态署理模式初解????public?DynamicSubject(Object?obj)?...{
java动态署理模式初解????????
java动态署理模式初解????????sub?=?obj;
java动态署理模式初解????}
java动态署理模式初解????
java动态署理模式初解????private?Object?sub;
java动态署理模式初解
java动态署理模式初解????public?Object?invoke(Object?proxy,?Method?method,?Object[]?args)
java动态署理模式初解java动态署理模式初解????????????throws?Throwable?...{
java动态署理模式初解????????//?TODO?Auto-generated?method?stub
java动态署理模式初解????????System.out.println("before?you?do?thing");
java动态署理模式初解????????method.invoke(sub,?args);
java动态署理模式初解????????System.out.println("after?you?do?thing");
java动态署理模式初解????????return?null;
java动态署理模式初解????}
java动态署理模式初解
java动态署理模式初解
java动态署理模式初解
java动态署理模式初解}
java动态署理模式初解
该代理类的内部属性为Object类,实际使用时通过该类的构造函数DynamicSubject(Object obj)对其赋值;此外,
在该类还实现了invoke方法,该方法中的

method.invoke(sub,args);

其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,args为执行被代理对象相应操作所需的参数。
通过动态代理类,我们可以在调用之前或之后执行一些相关操作。

调用事例
java动态署理模式初解package?dynamicproxy;
java动态署理模式初解
java动态署理模式初解import?java.lang.reflect.InvocationHandler;
java动态署理模式初解import?java.lang.reflect.Proxy;
java动态署理模式初解
java动态署理模式初解import?proxypattern.RealSubject;
java动态署理模式初解import?proxypattern.Subject;
java动态署理模式初解
java动态署理模式初解java动态署理模式初解public?class?Client?...{
java动态署理模式初解
java动态署理模式初解java动态署理模式初解????/**?*//**
java动态署理模式初解?????*?@param?args
java动态署理模式初解?????*/
java动态署理模式初解java动态署理模式初解????public?static?void?main(String[]?args)?throws?Throwable...{
java动态署理模式初解????????//?TODO?Auto-generated?method?stub
java动态署理模式初解?????????RealSubject?rs=new?RealSubject();
java动态署理模式初解?????????InvocationHandler?ds=new?DynamicSubject(rs);
java动态署理模式初解?????????Class?cls=rs.getClass();
java动态署理模式初解?????????Subject?subject=(Subject)Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),ds);
java动态署理模式初解?????????subject.dothing();
java动态署理模式初解????}
java动态署理模式初解
java动态署理模式初解}
java动态署理模式初解
通过这种方式,被代理的对象(RealSubject)可以在运行时动态改变,需要控制的接口(Subject接口)可以在运行时改变,
控制的方式(DynamicSubject类)也可以动态改变,从而实现了非常灵活的动态代理关系。