GOF23设计模式之动态代理模式实现之经典
来源:互联网 发布:beats微先专卖店 知乎 编辑:程序博客网 时间:2024/06/05 00:57
/** * 抽象就角色,定义代理角色和真实角色的公共对外方法 * 时间:2015年4月4日18:45:00 * 在这个例子中,抽象角色起着规范代理角色和真实角色的作用。 * 其中具有方法,面谈,签合同收预付款,预订机票,唱歌,收尾款 */package com.bjsxt.cn.proxy.dynamicProxy;
public interface Star { void confer(); void signContract(); void bookTicket(); void sing(); void collectMoney();}
/** * 相当于真实角色,实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色使用 * 也就是这个类的对象(例如周杰伦),他要实现他的sing方法,这是他的药关注的业务逻辑。这个实现了的 * sing方法是为了供代理角色使用的 * * 只需要关注真正的业务逻辑,其他方法是不用关注的 */package com.bjsxt.cn.proxy.dynamicProxy;
public class RealStar implements Star {
/** * 面谈 */ @Override public void confer() { System.out.println("RealStar.confer()"); }
@Override public void signContract() { System.out.println("RealStar.signContract()"); }
@Override public void bookTicket() { System.out.println("RealStar.bookTicket()"); }
@Override public void sing() { System.out.println("RealStar(真实角色:周杰伦).sing()");
}
@Override public void collectMoney() { System.out.print("RealStar.collectMoney()"); } }
/** * 处理器接口InvocationHandler,可以通过invoke实现对真实角色的访问 * 每次通过过Proxy生成的代理类对象时都要指定对应的处理器对象 * */package com.bjsxt.cn.proxy.dynamicProxy;
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;
/** * InvocationHandler接口是代理实例的调用程序实现的接口 * 每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码 * 并将其指派到它的调用处理程序的invoke方法。 * @author wannachan@outlook.com * */public class StarHandler implements InvocationHandler {
Star realStar = null; public StarHandler(Star realStar) { super(); this.realStar = realStar; }
/** * 在代理实例上处理方法调用并返回结果,在于方法关联的代理实例上调用方法,将在调用 * 处理程序上调用此方法 * @param method * 对应用于在代理实例上调用的接口方法的Method实例。Method对象的生命类将是在其中声明方法 * ,该接口可以是代理类赖以继承方法的代理接口的超接口。 * * @param args 包含传入代理实例上方法调用的参数值的对象数组。如果接口方法不使用参数,则为null * 注意:基本类型的参数被包装在适当的基本包装器类(java.lang.Integer或者java.lang.Boolean)的实例中 * * @param proxy 在其上调用方法的代理实例 * * @return * 从代理实例的方法调用返回的值。如果接口方法的声明返回类型是基本类型, * 则此方法返回的值一定是相应基本包装对象类的实例; * 否则,它一定是可分配到声明返回类型的类型。 * 如果此方法返回的值为 null 并且接口方法的返回类型是基本类型, * 则代理实例上的方法调用将抛出 NullPointerException。 * 否则,如果此方法返回的值与上述接口方法的声明返回类型不兼容, * 则代理实例上的方法调用将抛出 ClassCastException */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object object =null; if (method.getName().equals("sing")) { System.out.println("面谈,签合约,收预付款,预定机票"); System.out.println("在真正的方法调用前"); object = method.invoke(realStar, args); System.out.println("在真正的方法调用后"); System.out.println("收尾款"); } return object; }
}
/** * 测试动态代理类 * 时间:2015年4月4日20:01:43 * */package com.bjsxt.cn.proxy.dynamicProxy;/** * Proxy类提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类 * * 动态代理类是一个实现在创建类时在运行时指定的接口列标的类,该类具有以下行为:代理接口 * 是指代理类实现的一个借口。代理实例是代理类的一个实例。每个代理类的代理实例上的方法调用将 * 被指派到实例的调用处理程序的Invoke方法。并床底代理实例,识别调用方法的java.lang.reflect.Method对象以及包含的Object类型的 * 数组。调用处理程序以适当的方式处理编码的方法调用。并且它返回的结果将作为代理实例上方法调用的结果返回。 * * * 一般创建某一接口的Foo的代理: * InvocationHandler handler = new MyInvocationHandler(...);//获得一个处理器 Class proxyClass = Proxy.getProxyClass( Foo.class.getClassLoader(), new Class[] { Foo.class }); Foo f = (Foo) proxyClass. getConstructor(new Class[] { InvocationHandler.class }). newInstance(new Object[] { handler }); 或者使用以下更简单的方法:(本例也使用的是下面的方法) Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class[] { Foo.class }, handler);
*/import java.lang.reflect.Proxy;
public class Client { public static void main(String[] args) { Star realStar = new RealStar(); StarHandler handler = new StarHandler(realStar); /** * 换言之,该代理类的实例proxy,实现了指定的接口列表中的类(我们在静态代理中也同样的实现了Star一样 * ,就是因为实现了Star接口,所以我们可以声明为Star类型,这大概也是一种多态行为的使用吧。切切) * * 在这行代码中,Star.class表示的是代理接口(代理类实现的一个接口)。代理实例指的是proxy,它实现了Star接口 */ Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class} , handler); // proxy.bookTicket(); /** * 在这行代码中,我们可以粗略的获得三种信息,proxy是代理实例,方法名是sing,该方法没有参数, * 全部传递给了与该代理实例所关联的调用处理程序。 */ proxy.sing(); }}
/* * * 面谈,签合约,收预付款,预定机票在真正的方法调用前RealStar(真实角色:周杰伦).sing()在真正的方法调用后收尾款
* */
0 0
- GOF23设计模式之动态代理模式实现之经典
- GOF23设计模式之静态代理模式实现之经典
- GOF23设计模式之动态代理模式之理解
- GOF23 设计模式之 代理模式
- GOF23代理模式之静态代理模式理解之经典
- GOF23之代理模式Demo
- GOF23设计模式之原型模式之实现
- GOF23设计模式之组合模式之实现
- GOF23设计模式之装饰模式之实现
- GOF23设计模式之外观模式之实现
- 设计模式之动态代理 jdk实现
- (GOF23设计模式)_代理模式_动态代理
- 设计模式GOF23之单例模式实现
- GOF23设计模式之工厂方法模式的实现
- GOF23设计模式之抽象工厂模式的实现
- GOF23设计模式之适配器模式的实现
- GOF23设计模式之桥接模式的实现
- GOF23设计模式之享元模式的实现
- sed 和 awk的基本运用
- [leetcode]Binary Tree Preorder Traversal
- RTMP流媒体播放过程
- scanf&getchar&gets及一些特殊用法
- ACM基本技巧
- GOF23设计模式之动态代理模式实现之经典
- 黑马程序员_部分基础类的了解
- 批量监听问题
- Javaweb学习笔记9—过滤器
- 裂缝中的阳光。
- JavaScript 札记
- 蓝桥杯 数量周期
- 子div块中设置margin-top时影响父div块位置的解决办法及其原因
- 求子数 组的最大和