源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-12-25 06:00 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:java 静态代理 动态代理深入学习
[b]一、代理模式[/b] 代理模式是常用的java设计模式,特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 按照代理的创建时期,代理类可以分为两种: 静态代理:由程序员创建或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。 动态代理:在程序运行时运用反射机制动态创建而成。 [b]二、单个静态代理[/b]
[u]复制代码[/u] 代码如下:
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 [b]三、多个静态代理[/b] 在上面代码的基础上新增了
[u]复制代码[/u] 代码如下:
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"); } }
调用代码就变成了
[u]复制代码[/u] 代码如下:
// 体现了聚合的思想,代理之间的组合 public static void main(String[] args) { CountTrancProxy trancProxy = new CountTrancProxy(new CountDaoImpl()); CountLogProxy logPro = new CountLogProxy(trancProxy); logPro.queryCount(); }
Log start 事务处理之前 查看账户方法... 事务处理之后 Log end [b]四、总结[/b] 其实可以用代理类可以用继承或实现接口两种方式达到代理的效果,但是当多个代理类需要相互组合的时候,继承就不灵活了,需要不断重写代理类,而实现接口的方式就十分容易通过的聚合实现代理类之间的组合。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部