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