设计模式之动态代理模式

来源:互联网 发布:软件外包公司介绍ppt 编辑:程序博客网 时间:2024/06/04 23:21
设计模式之动态代理模式

代理模式:

Provide a surrogate or placeholder for another object to controlaccess to it(为其他对象提供一种代理以控制对这个对象的访问)。使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销 大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能

代理模式相关内容详见本人之前文章:http://www.cnblogs.com/zhaoww/p/5082035.html

动态代理:

下面贴出一个简单的关于日志的代理代码:

 1 public class MessageDaoLoggingProxy { 2      3     private MessageDao target; 4     //日志 5     private static Logger logger = Logger 6             .getLogger(MessageDaoLoggingProxy.class); 7  8     public MessageDaoLoggingProxy(MessageDao target) { 9         super();10         this.target = target;11     }12 13     public MessageDao getLoggingProxy() {14         MessageDao proxy = null;15         // 代理对象由哪个类加载器加载16         ClassLoader loader = target.getClass().getClassLoader();17         // 代理对象类型,即包含哪些方法18         Class<?>[] interfaces = new Class[] { MessageDao.class };19         // 调用方法时执行的方法20         InvocationHandler h = new InvocationHandler() {21             @Override22             public Object invoke(Object proxy, Method method, Object[] args)23                     throws Throwable {24                 String methodName = method.getName();25 26                 if (args == null) {27                     logger.info("Method: " + methodName + " || Params: null");28                 } else {29                     logger.info("Method: " + methodName + " || Params: "30                             + Arrays.asList(args));31                 }32                 Object result = method.invoke(target, args);33 34                 logger.info("Method: " + methodName + " || Results: " + result);35                 return result;36             }37         };38         39         proxy = (MessageDao) Proxy.newProxyInstance(loader, interfaces, h);40 41         return proxy;42     }43 44 }

当上一层代码需要使用代理的目标时,需要先将创建此目标对象,再通过代理类的getLoggingProxy()方法即可。

1  MessageDao target = new MessageDaoImpl();2   //日志代理3   MessageDao messageDao =new MessageDaoLoggingProxy(target).getLoggingProxy();


本例中我是用内部类的方式实现InvocationHandler,当然同样可以用实现InvocationHandler接口的方式。

 

0 0
原创粉丝点击