代理模式
代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。
1)静态代理
第一步:创建服务类接口
public interface BuyCar { public void BuyCar(); }
第二步:实现服务接口
public class BuyCarImpl implements BuyCar{ @Override public void BuyCar() { System.out.println("Buy a car"); } }
第三步:创建代理类
public class BuyCarProxy implements BuyCar{ private BuyCar buyCar; public BuyCarProxy(BuyCar buyCar){ this.buyCar = buyCar; } @Override public void BuyCar() { System.out.println("买车前准备"); buyCar.BuyCar(); System.out.println("买车后准备"); }
第四步:编写测试类
public class BuyCarTest { public static void main(String[] args){ BuyCarImpl buyCarImpl = new BuyCarImpl(); BuyCarProxy buyCarProxy = new BuyCarProxy(buyCarImpl); buyCarProxy.BuyCar(); } }
静态代理总结:
优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。
缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。
2)动态代理
第一步:编写动态处理器
public class DynamicAgent { static class MyHandler implements InvocationHandler{ //构造方法 private Object proxy; public MyHandler(Object proxy){ this.proxy = proxy; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before invoke"); Object ret = method.invoke(this.proxy, args); System.out.println("After invoke"); return ret; } } public static Object agent(Class interfaceClazz, Object proxy){ return Proxy.newProxyInstance(interfaceClazz.getClassLoader(), new Class[]{interfaceClazz}, new MyHandler(proxy)); }
第二步:编写测试类
public class ReflectTest { public static void main(String[] args) throws Exception{ Fruit fruit = (Fruit)DynamicAgent.agent(Fruit.class, new Apple()); fruit.show(); } }