java 静态代理 * 深入学习

时间:2022-07-24 21:46:25 

一、代理模式
代理模式是常用的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
四、总结
其实可以用代理类可以用继承或实现接口两种方式达到代理的效果,但是当多个代理类需要相互组合的时候,继承就不灵活了,需要不断重写代理类,而实现接口的方式就十分容易通过的聚合实现代理类之间的组合。

标签:java, , ,静态代理
0
投稿

猜你喜欢

  • OnSharedPreferenceChangeListener详解及出现不触发解决办法

    2021-10-25 19:06:36
  • 如何把本地jar包导入maven并pom添加依赖

    2021-12-31 04:11:28
  • 解析rainbond以应用为中心的架构设计原理

    2023-02-05 14:19:50
  • c#调用arcgis地图rest服务示例详解(arcgis地图输出)

    2023-03-05 14:56:05
  • Android实现跳动的小球加载动画效果

    2022-01-24 19:43:28
  • C#中using指令的几种用法

    2022-01-25 01:35:25
  • Mybatis基于xml配置实现单表的增删改查功能

    2021-09-29 11:21:48
  • Java多线程状态及方法实例解析

    2021-09-10 22:49:53
  • c#生成站点地图(SiteMapPath)文件示例程序

    2022-08-03 02:26:55
  • Struts2 Result 参数详解

    2022-04-28 07:54:35
  • java自定义切面增强方式(关于自定义注解aop)

    2022-05-30 15:16:58
  • Java equals 方法与hashcode 方法的深入解析

    2022-03-05 19:20:15
  • java实现简易飞机大战

    2022-08-27 12:36:07
  • java模拟斗地主发牌功能

    2023-06-26 08:01:34
  • Android滑动拼图验证码控件使用方法详解

    2021-10-03 02:56:06
  • 深入Android Browser配置管理的详解

    2021-09-11 20:48:54
  • AndroidStudio实现能在图片上涂鸦程序

    2023-09-14 06:57:02
  • JAVA如何调用wsdl过程详解

    2021-08-12 22:00:18
  • Android使用剪切板传递数据

    2022-06-07 05:44:28
  • C#使用NPOI实现Excel和DataTable的互转

    2022-12-06 22:51:05
  • asp之家 软件编程 m.aspxhome.com