意图:为其他对象提供一种代理以控制对这个对象的访问
结构
或者
.静态代理
举个简单的例子,首先定义一个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");
}
}
运行结果:
应用场合:
1.远程代理
2.虚代理
3.保护代理
4.只能引用
补充动态代理
动态代理指的是通过一个代理对象来创建需要的业务对象,然后在这个代理对象中统一进行各种需求的处理
1、写一个类实现相应的InvocationHandler接口
2、创建要代理的对象
动态代理可以将一些横切性的问题(日志管理,权限控制)提取出来成为一个模块,之后在运行的时候根据需要切入到原有正常代码中。
步骤:
1、 创建动态代理类
创建一个类实现InvocationHandler接口。以后创建对象就完全通过这个代理类来进行创建
2、在代理类创建相应的要代理的对象
3、创建一个静态的newInstance方法来创建代理对象
4、创建了代理对象之后,这个代理对象在执行任何方法时都会先执行invoke方法,就可以在这个方法中加入控制信息
5 、根据以上步骤之后,日志管理就被提取成为一个独立的模块,在运行时进行加入
6、由于使用的newInstance这个static的方法注入对象,所以无法使用Annotation需要使用xml的配置文件
7、此时可以考虑为相应的方法增加Annotation来增强相应的操作