java设计模式
静态代理 :一个RealSubject类对应一个Proxy类
如果有多个RealSubject,该怎么办呐?
动态代理
1.创建抽象类
public interface Subject {
void eat() throws Exception;//抽象主题
}
2.创建真实类RealSubject——被代理的类
import java.util.Random;
public class Pig implements Subject{
//RealSubject真实主题
@Override
public void eat() throws Exception {
Thread.sleep(new Random().nextInt(1000));
System.out.println("猪正在吃饭中......");
}
}
3.创建事务处理器
InvocationHandler接口
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
参数:
proxy 被代理的对象(真实对象RealSubject)
method 被代理对象的方法(所哦调用真实对象的某个方法的Method对象)
args 方法的参数(调用真实对象某个方法时接受的参数)
返回:
Object 方法返回值
具体实现
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class TimeHandler implements InvocationHandler{
private Object object;//绑定委托对象,即具体实现类的实例化对象
public TimeHandler(Object object){
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
long startTime = System.currentTimeMillis();
System.out.println("猪开始吃饭…");
method.invoke(object, args);
long stopTime = System.currentTimeMillis();
System.out.println("猪结束吃饭");
System.out.println("猪的吃饭时间:" + (stopTime - startTime) + "毫秒!");
return null;
}
}
4.测试类
Proxy类——动态创建一个代理对象的类
public class Proxy implements java.io.Serializable {
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h) {
//这个方法的作用:得到一个动态的代理对象
......
}
}
loader 类加载器:定义了由哪个ClassLoader对象来对生成的代理对象加载
interfaces 实现接口:Intrface对象数组,表示的是将要给代理的对象提供一组什么接口,如果我提供了一组接口,它就实现该接口——就能调用该接口的方法
h InvocationHandler:表示的是当动态代理对象在调用方法时,会关联到哪个InvocationHandler对象上
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args) throws Exception {
Pig pig = new Pig();
InvocationHandler handler = new TimeHandler(pig);
Class<?> cls = pig.getClass();
Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),handler);
subject.eat();
}
}
5.运行结果
动态代理&静态代理 :动态代理不需要我们去编写代理类,在程序中动态生成,而静态代理是则是我们自己编写好类