静态代理
就是为其他对象(真实对象,卓嫁衣)提供一种代理(戴励)以控制对这个对象的访问。
静态代理关键是
在代理对象和目标对象实现共同的接口,并且代理对象持有目标对象的引用
。
使用场景:
代理模式就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。
缺点:如果我们像Hello这样的类很多,那么,我们是不是要去写很多个HelloProxy这样的类呢。其实也是一种很麻烦的事。在jdk1.3以后,jdk跟我们提供了一个API java.lang.reflect.InvocationHandler
的类, 这个类可以让我们在JVM调用某个类的方法时动态的为这些方法做些什么事
。
公共接口代码:
public interface IHello {
/**
* 业务方法
* @param str
*/
void sayHello(String str);
}
目标类代码:
public class Hello implements IHello{
@Override
public void sayHello(String str) {
System.out.println("hello "+str);
}
}
代理类代码,我们给它添加日志记录功能,在方法开始前后执行特定的方法,是不是和AOP特别像呢?
public class ProxyHello implements IHello{
private IHello hello;
public ProxyHello(IHello hello) {
super();
this.hello = hello;
}
@Override
public void sayHello(String str) {
Logger.start();//添加特定的方法
hello.sayHello(str);
Logger.end();
}
}
日志类代码:
public class Logger {
public static void start(){
System.out.println(new Date()+ " say hello start...");
}
public static void end(){
System.out.println(new Date()+ " say hello end");
}
}
测试代码:
public class Test {
public static void main(String[] args) {
IHello hello = new ProxyHello(new Hello());//如果我们需要日志功能,则使用代理类
//IHello hello = new Hello();//如果我们不需要日志功能则使用目标类
hello.sayHello("明天");
}
}