IOU 设计模式介绍及应用
2010-03-15 00:00:00 来源:WEB开发网清单 2. Escrow 接口定义
public interface Escrow
{
// 发行 Iou 对象
Iou issueIou();
// 终止 Iou 对象,参数是最终结果
void close(Object o);
}
Callback 接口定义
IOU 模式中的回调机制主要是为了提供一种当 Iou 对象进入结果可赎回状态时能够立即执行某些回调动作的能力。每个回调对象都需实现 Callback 接口,并向感兴趣的 Iou 对象进行注册。每个 Iou 对象都会维护一个 Callback 对象列表,每个 Callback 对象在该 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);
}
}
}
}
赞助商链接