静态代理、JDK和Cglib动态代理的简单使用

静态代理、JDK和Cglib动态代理的简单使用

代理模式一直是编程世界中解决问题的良方,再配合Java中的的反射和字节码生成等技术,代理模式在Java世界及各大框架中起到举足轻重的作用。本篇文章会通过一个简单的例子简要介绍 java中的静态代理、JDK动态代理和 Cglib动态代理的基本使用,另外通过这个实例对这三种代理模式的进行分析。


一、基础场景

近期都在抢火车票了,这里就以买票这个场景作为基础。

一个买卖票的接口类,一个是12306的基础买票和卖票实现。

//卖火车票接口
public interface TicketSeller {
    void query();
    void sell();
}
//12306 被代理方
public class Seller12306 implements TicketSeller {

    @Override
    public void query() {
        System.out.println("您好,您回家的票还有……1张");
    }

    @Override
    public void sell() {
        System.out.println("您已购买回家的票!");
    }

}

下面分别用3种代理来实现同样的功能,希望在query()sell() 前后分别添加一段提示信息。

二、静态代理

第三方代理售票,比如美团、铁友啊

//第三方代理售票,加了漂亮的头和尾。。。>..
public class MeiTuanSeller implements TicketSeller {
    private Seller12306 seller12306;

    public MeiTuanSeller(Seller12306 seller12306) {
        this.seller12306 = seller12306;
    }

    @Override
    public void query() {
        System.out.println("***********before***********");
        seller12306.query();
        System.out.println("***********after************");
    }

    @Override
    public void sell() {
        System.out.println("***********before***********");
        seller12306.sell();
        System.out.println("***********after************");
    }
}

使用

//调用
TrainTicketSeller seller = new MeiTuanSeller(new Seller12306());
seller.query();
seller.sell();

/**输出结果:
***********before***********
您好,您回家的票还有……1张
***********after************
***********before***********
您已购买回家的票!
***********after************
**/

为什么要用代理呢?

当然可以不用,就想买个票,直接上12306就行,但是可能有人觉得第三方功能更多呀,界面更美观呀。(被代理后,能力增强)

代理中新加的功能,不能直接修改被代理方或者在被代理方增加么?

有时候被被代理方,更希望的是核心功能稳定,而不是其他的附加功能。12306前几年光是卖票就够受的了,哪有心思给你做附加功能?(修改有成本和风险,甚至可能影响核心系统稳定)。

​ 如果第三方售票来做这个事情,第一12306不用动,第二各个第三方可以自由的拓展卖票能力,比较灵活。

发表评论

电子邮件地址不会被公开。 必填项已用*标注