代理(proxy)

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

结构

      image

或者

image

.静态代理

举个简单的例子,首先定义一个Ihello接口

代码

ihello.java

public interface Ihello {
    public void hello(String name);
}

然后让实现业务逻辑的HelloSpeaker类实现Ihello接口,HelloSpeaker.java代码如下

HelloSpeaker.java

public class HelloSpeaker implements Ihello{
    public void hello(String name){
          System.out.println("hello,"+name);
    }
}

可以看到,在HelloSpeaker类中没有任何日志的代码插入其中,日志服务的实现将被放到代理类中,代理类同样要实现Ihello接口:


HelloProxy.java

import java.util.logging.*;
public class HelloProxy implements Ihello{
    private Logger logger=Logger.getLogger(this.getClass().getName());
    private Ihello helloObject;
    public HelloProxy(Ihello helloObject){
            this.helloObject=helloObject;
    }
    public void hello(String name){
        log("hello method starts…");                 // 日志服务
         helloObject.hello(name);                    // 执行业务逻辑
        log("hello method ends…");                     // 日志服务
    }
    private void log(String msg){
        logger.log(Level.INFO,msg);
    }
}

在HelloProxy类的hello()方法中,真正实现业务逻辑前后可以安排记录服务,可以实际撰写一个测试程序来看看如何使用代理类。

proxydemo.java

public class ProxyDemo {
    public static void main(String[] args){
        Ihello proxy=new HelloProxy(new HelloSpeaker());
        proxy.hello("Justin");
    }
}

运行结果:

image

应用场合:

1.远程代理

2.虚代理

3.保护代理

4.只能引用

补充动态代理

动态代理指的是通过一个代理对象来创建需要的业务对象,然后在这个代理对象中统一进行各种需求的处理
1、写一个类实现相应的InvocationHandler接口
2、创建要代理的对象

动态代理可以将一些横切性的问题(日志管理,权限控制)提取出来成为一个模块,之后在运行的时候根据需要切入到原有正常代码中。
步骤:
1、 创建动态代理类
创建一个类实现InvocationHandler接口。以后创建对象就完全通过这个代理类来进行创建
2、在代理类创建相应的要代理的对象

image

3、创建一个静态的newInstance方法来创建代理对象

image

4、创建了代理对象之后,这个代理对象在执行任何方法时都会先执行invoke方法,就可以在这个方法中加入控制信息

image

5 、根据以上步骤之后,日志管理就被提取成为一个独立的模块,在运行时进行加入


6、由于使用的newInstance这个static的方法注入对象,所以无法使用Annotation需要使用xml的配置文件

image
 
7、此时可以考虑为相应的方法增加Annotation来增强相应的操作

posted @ 2015-03-13 22:05  elite_2012  阅读(432)  评论(0编辑  收藏  举报