引用
委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。委托模式使得我们可以用聚合来替代继承,它还使我们可以模拟mixin。
“委托”在C#中是一个语言级特性,而在Java语言中没有直接的对应,但是我们可以通过动态代理来实现委托!代码如下:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 实现“委托”模式,用户需要实现InvocationHandler接口;
* @author zhangfeng
* 20102010-3-3上午08:59:20Delegator.javaet.test.chelve
*/
public abstract class Delegator implements InvocationHandler{
// RelegateTo针对每个对象都要生成一个实例,因而非Static的log,代价比较高。
//protected Log _log = LogFactory.getLog(this.getClass());
//private static Log _log = LogFactory.getLog(RelegateTo.class);
protected Object obj_orgin = null; //原始对象
protected Object obj_proxy = null; //代理对象
public Delegator(){
//空
}
public Delegator(Object orgin){
this.createProxy(orgin);
}
protected Object createProxy(Object orgin){
obj_orgin = orgin;
obj_proxy = Proxy.newProxyInstance(
orgin.getClass().getClassLoader(), //加载器
orgin.getClass().getInterfaces(), //接口集
this
);
return obj_proxy;
}
protected Object invokeSuper(Method method,Object[] args)
throws Throwable{
return method.invoke(obj_orgin, args);
}
public Object invoke(Object obj,Method method,Object[] args)
throws Throwable{
//委托给obj_orgin完成相对应的操作
if(method.getName().equals("toString")){//对其额外处理
return this.invokeSuper(method,args)+"$Proxy";
}else{ //调用原始对象的方法,而不是代理的
return this.invokeSuper(method, args);
}
}
}
import java.lang.reflect.Method;
import java.util.Hashtable;
import java.util.Map;
/**
* 主要用于演示RelegateTo的使用方法
* @author zhangfeng
* 20102010-3-3上午09:27:13Delegator4Map.javaet.test.chelve
*/
public class Delegator4Map extends Delegator{
private Map orginClass = null; //原始对象
private Map proxyClass = null; //代理对象
public Map getOrgin(){return orginClass;}
public Map getProxy(){return proxyClass;}
public Delegator4Map(Map orgin){
super(orgin);
orginClass = orgin;
proxyClass = (Map)super.obj_proxy;
}
public Object invoke(Object obj,Method method,Object[] args)
throws Throwable{
if(method.getName().equals("size")){ //修改close处理逻辑
System.out.println("原始 size()="+super.invoke(obj, method, args));
Object res2 = new Integer(-1);
System.out.println("修改 size()="+res2);
return res2;
}else{
return super.invoke(obj, method, args);
}
}
public static void main(String[] args) {
Delegator4Map rtm = new Delegator4Map(new Hashtable());
Map m = rtm.getProxy();
m.size();
System.out.println("代理:"+m.toString());
}
}
分享到:
相关推荐
关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理。 代理模式是常用的java设计模式,他的特征是代理类与委托类有...
Java中提供了一个java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。代理类在运行时会根据被代理接口自动生成,并且可以通过InvocationHandler接口对方法进行增强。
java 观察者模式 事件委托
代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个...
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类...
对于C#的委托、代理概念所使用的Callback(回调模式--参见本人的“第一个C#程序Hello World ”资源)来看,Java Swing编程是纯粹的OO语言、是一种非常优雅的编程语言(本人认为)--而C#的学习好像非常强调所谓的OO思想...
设计模式3 1.1 创立型模式4 1.1.1 工厂方法4 1.1.2 抽象工厂6 1.1.3 建造...代理模式34 1.3 行为型模式37 1.3.1 责任链模式37 1.3.2 命令模式40 1.3.3 解释器模式43 1.3.4 迭代器模式45 1.3.5 中介者模式49 1.3.6 备忘...
代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个...
委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式...
java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...
代理模式(Proxy Pattern) 定义:Provide a surrogate or placeholder for another object to control access to it. (为其他对象提供一种代理以控制对这个对象的访问。) ● Subject 抽象主题角色 抽象主题类可以是...
org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 ...
委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式...
Java软件体系结构设计模式之结构模式(11种) 结构模式主要用来: 1)处理把责任委托给... 1)装饰器模式用于动态地扩展一个对象的功能,而不需要改变原始的类代码或使用继承。这一点是通过在一个实际对象的外
所以,本人根据Java的监听器概念实现的观察者模式,重新用C#代码来描述了C#的难点技术--代理、事件、事件句柄--^_^...希望能够给C#的fan们带来帮助。 阅读条件:熟悉C#语言,会使用csc命令。 阅读人员:非常熟悉...
org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 ...
java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...
java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...