快速业务通道

IOU设计模式介绍及应用 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
/ 返回 escrow 发行的 Iou 欠条    return escrow.issueIou(); }

从方法调用者的角度:调用者获得 Iou 对象后,可以继续进行其他事务,直到需要结果的时候再对 Iou 进行赎回操作以获得真正结果(假设其真实类型是 Foo 接口,该接口声明有 bar 方法),则调用者还要把结果转换到 Foo 类型,然后再调用 bar 方法。调用者模型如清单 6 所示。

清单 6. 调用者的实现模型

// 调用 method 方法,获得 Iou 对象    Iou iou = method();    // 执行其他事务    ……    // 通过 Iou 赎回操作获得真实 result    Object result = iou.redeem();    // 将 result 类型转换到 Foo    Foo foo = (Foo)result;    // 然后访问 bar 方法    foo.bar();    …… 

IOU 模式的不足之处

由于 Escrow 发行的都是 Iou 对象,这在无意间要求 IOU 模式下的方法必须统一声明返回 Iou 接口,从而隐藏了结果的真实类型,用户必须依靠记忆记住真实类型并强制转换,然后才能访问结果。用户友好性的先天不足,或许是限制 IOU 模式广泛使用的一大因素。

双剑合璧:IOU 模式结合 Java 动态代理

IOU设计模式介绍及应用(5)

时间:2011-06-29 IBM / 王忠平 何平

鱼和熊掌可否兼得

理想的情况下,用户会希望 IOU 模式下方法的返回类型依然是真实类型。似乎是“鱼和熊掌不可兼得”式的矛盾,因为根据传统的观点,一个方法是无法返回两种类型的(尤其当两种类型又无必然的联系时)。但是,Java 动态代理机制给我们带来了希望(本文假设读者对 Java 动态代理机制已经有所了解,不了解的读者请查阅相关资料)。通过 Java 动态代理机制,我们能够动态地为一组目标接口(允许是任意不相关的接口)创建代理对象,该代理对象将同时实现所有接口。运用在这里,我们就能够创建一个即是 Iou 类型又是目标接口类型的代理对象,所以它能被安全地从 Iou 类型转换到目标接口类型并返回。这样就消除了传统 IOU 模式下方法返回类型的限制,我们称此为扩展 IOU 模式。

扩展 IOU 模式的 Java 实现

Java 动态代理的核心是将代理对象上的方法调用统统分派转发到一个 InvocationHandler 对象上进行处理,为此,我们需要在 RealIouEscrow 基础再实现一个 InvocationHandler 接口。当用户调用目标接口的任何方法时,都会自动转发到 InvocationHandler 接口的 invoke 方法上执行。在 invoke 方法内部,我们可以及时地进行赎回操作以获得真实结果,然后再通过反射调用相应方法来访问真实结果的属性或功能。对调用者而言,进行赎回操作时可能的等待是完全透明的,最终效果完全等价于直接在真实结果上调用某同步方法。RealIouEscrowEx 类实现见清单 7。

清单 7. RealIouEscrowEx 类实现

public class RealIouEscrowEx extends RealIouEscrow implements InvocationHandler {    // IOU 结果类的类型对象    private Class type;    public RealIouEscrowEx(Class type) throws IllegalArgumentException    {      if( type == null || !type.isInterface() )      {        throw new IllegalArgumentException("Unsupport non-interface type.");      }      this.type = type;    }    public Iou issueIou()    {      // 返回代理对象,该代理对象同时代理类 Iou 接口类型和结果接口类型      return (Iou)Proxy.newProxyInstance(Iou.class.getClassLoader(),        new Class[] {type, Iou.class},        this);    }    public Object invoke(Object 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号