设计模式之动态代理模式

设计模式之动态代理模式

代理模式:

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             @Override
22             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接口的方式。

时间: 2024-10-04 20:54:41

设计模式之动态代理模式的相关文章

Java设计模式—Proxy动态代理模式

代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 图 1. 代理模式 为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别.通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性.Java 动态代理机制以巧妙的方式近乎完

GOF23设计模式之动态代理模式实现之经典

 /**  * 抽象就角色,定义代理角色和真实角色的公共对外方法  * 时间:2015年4月4日18:45:00  * 在这个例子中,抽象角色起着规范代理角色和真实角色的作用.  * 其中具有方法,面谈,签合同收预付款,预订机票,唱歌,收尾款  */ package com.bjsxt.cn.proxy.dynamicProxy; public interface Star {  void confer();  void signContract();  void bookTicket();

设计模式之动态代理模式实战

动态代理在我们工作当中应用相当广泛,如Srping AOP就是动态代理的在开源框架的比较出名的应用.动态代理有两种试:一是通过JDK自带的API实现动态代理,二是通过别的字节码框架实现,如cglib.需要注意的是JDK只能针对接口实现动态代理,不能代理普通类,使用具有局限性.而cglib可以代理接口及所有的普通类. 用户接口 public interface UserInterface { boolean saveUser(User user); } 用户接口实现 public class Us

23种设计模式----------代理模式(三) 之 动态代理模式

(上一篇)种设计模式----------代理模式(二) 当然代理模式中,用的最广泛的,用的最多的是  动态代理模式. 动态代理:就是实现阶段不用关系代理是哪个,而在运行阶段指定具体哪个代理. 抽象接口的类图如下: --图来自设计模式之禅 所以动态代理模式要有一个InvocationHandler接口 和 GamePlayerIH实现类.其中 InvocationHandler是JD提供的动态代理接口,对被代理类的方法进行代理. 代码实现如下 抽象主题类或者接口: 1 package com.ye

Android开发中无处不在的设计模式——动态代理模式

继续更新设计模式系列,写这个模式的主要原因是最近看到了动态代理的代码. 先来回顾一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式--Builder模式 - Android开发中无处不在的设计模式--观察者模式 - Android开发中无处不在的设计模式--原型模式 - Android开发中无处不在的设计模式--策略模式 动态代理模式在Java WEB中的应用简直是随处可见,尤其在Spring框架中大量的用到了动态代理:算是最重要

关于装饰模式和动态代理模式

装饰模式和动态代理模式乍一看差不多,都是动态的增加行为,其实有各自的区别. 一.首先我们看一下装饰设计模式,其基本思想如下: 1.编写一个类,实现与被装饰类相同的接口.目的使他们有相同的行为 2.定义一个实例变量,引用被装饰对象.目的和原来的老对象进行交接 3.定义构造方法,把被装饰对象注入进来. 4.对于不需要改写的方法,调用被装饰对象的. 5.对于要改写的方法,改写即可. 废话不多说,举一个例子,模拟实现一个数据库连接池,在这里,我想重写close方法,以实现调用close方法之后不是关闭连

深入解析Java设计模式之动态代理

深入解析Java设计模式之动态代理 代理是基本的设计模式之一,它是你为了提供额外的或不同的操作,而插入的用来代替"实际"对象的对象.这些操作通常涉及与"实际"对象的通信,因此代理通常充当着中间人的角色,下面是一个用来展示动态代理结构的简单示例: /** 普通(非动态)代理示例: */ interface Interface { void doSomething(); void somethingElse(String arg); } class RealObject

设计模式学习--------12.代理模式学习

场景: 福尔摩斯一直想送礼物给花生,但是羞于直接赠送,于是想到让房东太太去帮忙送礼物.编程如何实现呢? 定义: 为其他对象提供一种代理以控制对这个对象的访问. 角色: Proxy:代理对象.有下列功能: 实现与具体的目标对象一样的接口,这样就可以使用代理来代替具体的目标对象. 持有一个具体目标对象的引用,可以在需要时调用具体的目标对象. 可以控制对目标对象的访问,并可以负责创建和删除它. package com.kris.study; public class Proxy implements

【设计模式】Proxy 代理模式

[设计模式]Proxy 代理模式 1.代理模式的定义 代理模式:为另一个对象提供一个替身或占位符以控制对这个对象的访问. 2.静态代理 首先我们通过案例来引出为什么我们需要使用代理模式. 我们给出如下一个接口Moveable 和该接口的实现类: Moveable.java package com.proxy; public interface Moveable { void move(); } Tank.java package com.proxy; import java.util.Rando