广

Java编程

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    java 静态代理 动态代理深入学习

    2018-11-02 13:12:33 次阅读 稿源:互联网
    零七广告

    一、代理模式
    代理模式是常用的java设计模式,特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。
    代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
    按照代理的创建时期,代理类可以分为两种:
    静态代理:由程序员创建或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。
    动态代理:在程序运行时运用反射机制动态创建而成。
    二、单个静态代理
    代码如下:

    public interface CountDao
    {
    // 查看账户方法
    public void queryCount();
    }
    public class CountDaoImpl implements CountDao
    {
    public void queryCount()
    {
    System.out.println("查看账户方法...");
    }
    }
    public class CountTrancProxy implements CountDao
    {
    private CountDao countDao;
    public CountProxy(CountDao countDao)
    {
    this.countDao = countDao;
    }
    @Override
    public void queryCount()
    {
    System.out.println("tranc start");
    countDao.queryCount();
    System.out.println("tranc end");
    }
    }
    public class TestCount
    {
    public static void main(String[] args)
    {
    CountTrancProxy countProxy = new CountTrancProxy(new CountDaoImpl());
    countProxy.updateCount();
    }
    }

    tranc start
    查看账户方法...
    tranc end
    三、多个静态代理
    在上面代码的基础上新增了
    代码如下:

    public class CountLogProxy implements CountDao
    {
    private CountDao countDao;
    public CountLogProxy(CountDao countDao)
    {
    this.countDao = countDao;
    }
    @Override
    public void queryCount()
    {
    System.out.println("Log start");
    countDao.queryCount();
    System.out.println("Log end");
    }
    }

    调用代码就变成了
    代码如下:

    // 体现了聚合的思想,代理之间的组合
    public static void main(String[] args)
    {
    CountTrancProxy trancProxy = new CountTrancProxy(new CountDaoImpl());
    CountLogProxy logPro = new CountLogProxy(trancProxy);
    logPro.queryCount();
    }

    Log start
    事务处理之前
    查看账户方法...
    事务处理之后
    Log end
    四、总结
    其实可以用代理类可以用继承或实现接口两种方式达到代理的效果,但是当多个代理类需要相互组合的时候,继承就不灵活了,需要不断重写代理类,而实现接口的方式就十分容易通过的聚合实现代理类之间的组合。

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七广告
    零七广告
    零七广告
    零七广告