运维开发网

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

运维开发网 https://www.qedev.com 2020-01-29 13:35 出处:网络 作者: 网络整理
代理模式是常用的java设计模式,特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等,需要的朋友可以参考下

一、代理模式

代理模式是常用的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

四、总结

其实可以用代理类可以用继承或实现接口两种方式达到代理的效果,但是当多个代理类需要相互组合的时候,继承就不灵活了,需要不断重写代理类,而实现接口的方式就十分容易通过的聚合实现代理类之间的组合。

0

精彩评论

暂无评论...
验证码 换一张
取 消