对象在该 Iou 对象被终止时都有机会在结果对象上执行回调操作。Callback 接口定义见清单 3。
清单 3. Callback 接口定义
public interface Callback
{
// 在结果对象上执行回调任务
void callback(Object o);
}
IOU 模式的 Java 实现
Iou 接口侧重于债权人的操作,而 Escrow 侧重于债务人的操作,两个接口由同一个类来实现可以让实现变得更加简洁高效,具体实现见清单 4。
清单 4. RealIouEscrow 实现
public class RealIouEscrow implements Iou, Escrow
{
// Vector to hold all callbacks
private Vector callbacks;
// boolean indicate if IOU has been closed
private boolean closed;
// Object that I owe you
private Object objectIou;
public RealIouEscrow()
{
this.callbacks = new Vector();
this.closed = false;
}
public Iou issueIou()
{
// 直接返回对象本身,因为已经实现了 Iou 接口
return this;
}
public synchronized void addCallback(Callback cb)
{
if( this.closed )
{
// 若已经被终止,则直接回调
cb.callback(this.objectIou);
}
else
{
// 否则,将回调对象加入列表
this.callbacks.add(cb);
}
}
public synchronized void removeCallback(Callback cb)
{
// 将回调对象从列表中删除
this.callbacks.remove(cb);
}
public synchronized boolean closed()
{
return this.closed;
}
public synchronized Object redeem()
{
if( !this.closed )
{
// 如果尚未被终止,保持等待
standBy();
}
return this.objectIou;
}
public synchronized void standBy()
{
if( !this.closed )
{
try
{
wait();
}
catch (InterruptedException e)
{
}
}
}
public synchronized void close(Object o)
{
if( !this.closed )
{
// 首先设置结果对象
this.objectIou = o;
// 然后设置终止标志位
this.closed = true;
// 接着唤醒等待线程
this.notifyAll();
// 最后驱动回调者执行回调方法
Iterator it = this.callbacks.iterator();
while(it.hasNext())
{
Callback callback = (Callback)it.next();
callback.callback(this.objectIou);
}
}
}
}
IOU设计模式介绍及应用(4)
时间:2011-06-29 IBM / 王忠平 何平
IOU 模式的使用
从被调方法的角度:首先构造 Escrow 对象,然后启动异步执行服务并关联 Escrow 对象,最后返回 Escrow 对象发行的 Iou 对象。被调方法模型如清单 5 所示。
清单 5. 被调方法的实现模型
public Iou method( … )
{
// 首先创建 escrow 对象
Escrow escrow = new RealIouEscrow();
// 启动异步服务,并关联 escrow 对象
……
/
|