Java代理模式-静态代理和动态代理
静态代理
以租房为示例,不废话上代码
创建租房接口
public interface Rent { public void rent(); }
创建房东类
//房东 public class Host implements Rent{ public void rent() { System.out.println("房东要出租房子"); } }
创建代理对象
public class Proxy implements Rent{ private Host host; public Proxy() { } public Proxy(Host host) { this.host = host; } public void rent() { seeHouse(); host.rent(); hetong(); fare(); } // 看房 public void seeHouse(){ System.out.println("中介带你看房"); } // 收中介费 public void fare(){ System.out.println("收中介费"); } // 签租赁合同 public void hetong(){ System.out.println("签租赁合同"); } }
代码测试
public class Client { public static void main(String[] args) { // 房东要租房子 Host host=new Host(); // 代理,中介帮房东租房子,但是呢?代理角色一般会有一些附属操作! Proxy proxy = new Proxy(host); // 你不用面对房东,直接找中介租房即可! proxy.rent(); } }
执行结果
中介带你看房 房东要出租房子 签租赁合同 收中介费
动态代理
动态代理分为两大类:基于接口的动态代理,基于类的动态代理
需要了解两个类:proxy代理、InvocationHandler调用处理程序
基于接口---JDK原生动态代理
创建租房接口
public interface Rent { public void rent(); }
创建房东类
public class Host implements Rent { public void rent() { System.out.println("房东要出租房子"); } }
创建测试类
public class Client { public static void main(String[] args) { final Rent host = new Host(); Rent proxy =(Rent) Proxy.newProxyInstance(host.getClass().getClassLoader(), host.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException { System.out.println("中介带你看房"); Object invoke = method.invoke(host, args); System.out.println("签租赁合同"); return invoke; } }); proxy.rent(); } }
执行结果
中介带你看房 房东要出租房子 签租赁合同
说明一下Proxy对象的newProxyInstance方法
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
ClassLoader loader,
:指定当前目标对象使用类加载器,获取加载器的方法是固定的Class<?>[] interfaces,
:目标对象实现的接口的类型,使用泛型方式确认类型InvocationHandler h
:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入
还有其中 InvocationHandler 接口的 invok 方法
public Object invoke(Object proxy, Method method, Object[] args)
-
-
method,
:调用的方法 -
args