一、静态代理模式
1、编写委托接口
public interface Subject {
public void sale();
}
2、实现一个真正的委托类
public class RealSubject implements Subject {
public void sale() {
System.out.println("卖书");
}
}
3、代理类
public class ProxySubject implements Subject {
private RealSubject realSubject;
public void sale() {
dazhe();
if(null == realSubject){
realSubject = new RealSubject();
realSubject.sale();
}
daijinquan();
}
public void dazhe(){
System.out.println("打折");
}
public void daijinquan(){
System.out.println("代金券");
}
//运行结果
public static void main(String[] args) {
ProxySubject proxySubject = new ProxySubject();
proxySubject.sale();
}
//运行结果为(打折 卖书 代金券)
}
说明:我们可以看出 代理类接受一个Subject接口的对象,任何实现该接口的对象,都可以通过代理类进行代理,增加了通用性。
缺点是每一个代理类都要实现一遍委托类,如果接口增加方法,代理类也必须跟着修改,代理类每一个接口对象对应一个委托对象,
如果委托对象非常多,代理类非常臃肿。
二、动态代理
步骤如下:
1、编写一个委托类的接口,即静态代理的(Subject接口)
2、实现一个真正的委托类,即静态代理的(RealSubject类)
3、创建一个动态代理类,实现InvocationHandler接口,并重写该invoke方法
创建动态代理类
public class DynamicProxy implements InvocationHandler{
private Object object;
public DynamicProxy(Object object) {
this.object = object;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = method.invoke(object, args);
return result;
}
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
DynamicProxy proxy = new DynamicProxy(realSubject);
//调用Proxy的创建代理实体创建
Subject subject = (Subject)Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), proxy);
subject.sale(); //调用委托类的方法
}
}