IOU 设计模式介绍及应用
2010-03-15 00:00:00 来源:WEB开发网程序的最终执行输出见清单 11。
清单 11. 程序输出
[Mon Sep 14 13:33:41 CST 2009] Schedule a task to wash 'Dirty' clothes
>>> Starting to wash clothes
[Mon Sep 14 13:33:42 CST 2009] Do something other [442 millis]
[Mon Sep 14 13:33:42 CST 2009] Schedule a task to cook 'Uncooked' food
>>> Starting to cook food
[Mon Sep 14 13:33:42 CST 2009] Do something other [521 millis]
[Mon Sep 14 13:33:42 CST 2009] Be about to eat food...add some spice first...
>>> Object is not ready, stand by at calling addSpice()
<<< Finished wash clothes [1162 millis]
<<< Finished cook food [889 millis]
<<< Object is ready, continue from calling addSpice()
>>> Adding spice...
<<< Spice is added.
[Mon Sep 14 13:33:43 CST 2009] 'Cooked' food is eaten.
[Mon Sep 14 13:33:43 CST 2009] Be about to hang out clothes...
[Mon Sep 14 13:33:43 CST 2009] 'Clean' clothes are hung out.
来分析一下程序的执行情况:女管家在安排了洗衣事务后,继续做了 442 毫秒的其他事情,接着她又安排了烹饪事务,完后又做了 521 毫秒的其他事情,然后她打算开始享用食物(IOU 模式的魔力:女管家以为 cook 方法返回的“食物”是已经做好的),当她向食物上添加美味的调味品时,奇妙的事情发生了,扩展的 IOU 模式开始发挥作用,它会发现食物其实没有真正做好,于是在食物 Iou 对象上保持等待直至其被终止并可赎回(数据显示烹饪事务实际总耗时 889 毫秒),然后才执行真正的添加调味品动作,之后控制权又回到了女管家(女管家对之前的等待过程浑然不知,因为在她看来仅仅是一个普通的方法调用),女管家最终美美地享用了美味的食物,接着她开始晾晒衣服,这次衣服 Iou 对象的赎回进行得相当顺利,因为洗衣事务的确已经顺利完成了。在整个过程中,我们看到有若干事务在并行进行,却只有一个等待过程,而这唯一的等待过程也在 Java 动态代理机制下实现了对女管家的完全透明,这就是融合了动态代理机制后的扩展 IOU 模式的魅力所在。
总结
IOU 模式在帮助提高程序的并发性方面有着非常独到的作用,而引入了动态代理机制支持的扩展 IOU 模式又融入了更加友好的用户体验,两者相得益彰,可谓珠联璧合。
更多精彩
赞助商链接