IOU 设计模式介绍及应用
2010-03-15 00:00:00 来源:WEB开发网涉及的异步服务类是 AsyncService,它以异步方式处理 Processable 对象并调用其 process 方法,并且最后会终止 Escrow 对象以结束 Iou 债务。实例中的 AsyncService 是以后台线程为载体,但是实际应用中用户可以选择任意的异步机制。
最后的女管家类是 HouseKeeper。她需要进行的家务包括洗衣、做饭及其他,其中可以并行执行是洗衣和做饭,因为有洗衣机和电饭煲可以帮忙,剩下的则必须一件一件地进行。具体实现见清单 10。
清单 10. HouseKeeper 类
public class HouseKeeper
{
public static void main(String args[])
{
// 初始化待处理的衣服和食物对象
Clothes clothesToWash = new ClothesImpl();
Food foodToCook = new FoodImpl();
// 设定洗衣事务
Iou iou = wash(clothesToWash);
// 继续做其他事情
doSomethingOther();
// 设定烹饪事务
Food foodCooked = cook(foodToCook);
// 继续做其他事情
doSomethingOther();
// 开始享用食物
eat(foodCooked);
// 开始晾晒衣服
hangout(iou);
}
private static Iou wash(Clothes clothes)
{
logger("Schedule a task to wash " + clothes);
// 构造 Escrow 对象
Escrow escrow = new RealIouEscrow();
// 启动后台洗衣服务
AsyncService service = new AsyncService("wash clothes", clothes, escrow);
service.start();
// 随即通过 Escrow 对象发行一个传统的 Iou
return escrow.issueIou();
}
private static Food cook(Food food)
{
logger("Schedule a task to cook " + food);
// 构造扩展 Escrow 对象,并关联 Food 接口类型
Escrow escrow = new RealIouEscrowEx(Food.class);
// 启动后台烹饪服务
AsyncService service = new AsyncService("cook food", food, escrow);
service.start();
// 随即通过扩展 Escrow 对象发行一个扩展 Iou
// 它可以被安全地类型装换到 Food 类型
return (Food)escrow.issueIou();
}
private static void eat(Food food)
{
logger("Be about to eat food...add some spice first...");
// 演示在扩展 Iou 对象上执行方法(效果等价于在真实结果上调用该方法)
food.addSpice();
logger(food + " is eaten.");
}
private static void hangout(Iou iou)
{
logger("Be about to hang out clothes...");
// 演示在传统 Iou 对象上的检查、等待并赎回结果
if( !iou.closed() )
{
logger("Clothes are not ready, stand by...");
iou.standBy();
}
Object clothes = iou.redeem();
logger(clothes + " are hung out.");
}
……
}
更多精彩
赞助商链接