第一部分、代理模式
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。(其实就是在代理类中关联一个委托类的实例,然后在代理类中进行包装)。 UML图如下:
第二部分、在Java中实现代理模式
按照代理的创建时期,代理类可以分为两种。
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理:在程序运行时,运用反射机制动态创建而成。
一、静态代理:
1、Count.java
1 package net.battier.dao; 2 3 /** 4 * 定义一个账户接口 5 * 6 * @author Administrator 7 * 8 */ 9 public interface Count { 10 // 查看账户方法 11 public void queryCount(); 12 13 // 修改账户方法 14 public void updateCount(); 15 16 }
2、CountImpl.java
1 package net.battier.dao.impl; 2 3 import net.battier.dao.Count; 4 5 /** 6 * 委托类(包含业务逻辑) 7 * 8 * @author Administrator 9 * 10 */ 11 public class CountImpl implements Count { 12 13 @Override 14 public void queryCount() { 15 System.out.println("查看账户方法..."); 16 17 } 18 19 @Override 20 public void updateCount() { 21 System.out.println("修改账户方法..."); 22 23 } 24 25 } 26 27 、CountProxy.java 28 package net.battier.dao.impl; 29 30 import net.battier.dao.Count; 31 32 /** 33 * 这是一个代理类(增强CountImpl实现类) 34 * 35 * @author Administrator 36 * 37 */ 38 public class CountProxy implements Count { 39 private CountImpl countImpl; 40 41 /** 42 * 覆盖默认构造器 43 * 44 * @param countImpl 45 */ 46 public CountProxy(CountImpl countImpl) { 47 this.countImpl = countImpl; 48 } 49 50 @Override 51 public void queryCount() { 52 System.out.println("事务处理之前"); 53 // 调用委托类的方法; 54 countImpl.queryCount(); 55 System.out.println("事务处理之后"); 56 } 57 58 @Override 59 public void updateCount() { 60 System.out.println("事务处理之前"); 61 // 调用委托类的方法; 62 countImpl.updateCount(); 63 System.out.println("事务处理之后"); 64 65 } 66 67 }