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件商品
再见欢迎再来!
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容