Java - 动态代理

代理模式

代理就相当于 中介 买房子的找中介 买房子的找中介 买房子的卖房子的不直接接触,中介可以在代理中添加自己的服务

静态代理

就是代理类中的 代理对象是明确的类
缺点:一个代理对象 一个代理类
优点:速度比动态代理快

接口

public interface FoodFactory {
    void payFood(int  count);
}

接口实现

public class ImplFood implements FoodFactory {
    @Override
    public void payFood(int count) {
        System.out.println("购买了"+count+"份食物");
    }
}

静态代理

public class StaticProxy {
    private FoodFactory foodFactory;

    public FoodFactory getFoodFactory() {
        return foodFactory;
    }

    public void setFoodFactory(FoodFactory foodFactory) {
        this.foodFactory = foodFactory;
    }
    //方法增强
    public void payFoods(int count){
        before();
        foodFactory.payFood(count);
        after();
    }

    private void before(){
        System.out.println("您好!");
    }
    private void after(){
        System.out.println("再见欢迎再来!");
    }
}

运行

  public static void main(String[] args) {
        ImplFood food = new ImplFood();
        StaticProxy proxy = new StaticProxy();
        proxy.setFoodFactory(food);
        proxy.payFoods(10);
    }

结果

您好!
购买了10份食物
再见欢迎再来!

动态代理

就是代理类中 的代理对象 是未知的,需要通过调用时指定类,需要Java反射
缺点:需要反射 性能略有影响
优点:一个动态代理类 可以解决多个静态代理的问题,避免重复

动态代理类 要实现InvocationHandler

public class DynamicProxy implements InvocationHandler {

    private Object obj;

    public Object getProxy(Object obj){
        this.obj = obj;
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //方法增强
        before();
        Object o = method.invoke(obj,args);
        after();
        return o;
    }

    private void before(){
        System.out.println("您好!");
    }
    private void after(){
        System.out.println("再见欢迎再来!");
    }
}

运行

 public static void main(String[] args) {

        DynamicProxy proxy = new DynamicProxy();

        FoodFactory df = (FoodFactory) proxy.getProxy(new ImplFood());
        df.payFood(10);

        GoodsFactory dg = (GoodsFactory) proxy.getProxy(new ImplGoods());
        dg.payGoods("小明");
        dg.payGoodsCount(5);
    }

结果

您好!
购买了10份食物
再见欢迎再来!
您好!
小明购买了商品
再见欢迎再来!
您好!
5件商品
再见欢迎再来!

你可能感兴趣的:(Java - 动态代理)