连接
因为类型模型包含可选功能,它导致一个对象与其它对象互相矛盾。这里有一些限制的例子,说明不允许的连接关系。
出租的录像带不能被预订保留
c : Copy
-- If a copy is rented then 如果一个拷贝已经出租
c.currentRental -> notEmpty implies
-- it is not on hold 就不能被保留
c.~heldCopy -> isEmpty
当前的租借不是一个过去的租借
c : Copy
-- If a copy has a current rental then 如果一个拷贝正在出租
c.currentRental -> notEmpty implies
-- the copy’s past rentals do not include this current rental 过去的记录不包括当前出租
not c.pastRentals -> includes( c.currentRental )
状态模型
状态模型非常强大,因为它们将注意力从关心所有类型整体的角度转移到一种类型的整个生命周期。这里有两个类型的状态模型。
预订
当一个会员预订一部影片时,创建一个预订对象。
预订创建后,就进入“等待”状态。“可满足”预订是指当一个拷贝被保留(当预订被满足,会有一个消息通知会员)。一个预订变为“已满足”是当该会员租借了预订影片的一个拷贝。一个预订过期是指被通知的会员在规定期限内没有租借预定影片。
当一个预订被取消(“等待”状态或“可满足”状态),预订状态变为“已取消”。随着这个动作,另一个预订的状态可能从“等待”状态变为“可满足”状态。
拷贝
以下是拷贝类型的状态模型。随后用一个示例场景帮助解释。
操作拷贝的动作不属于租借主题的范围。如果没有特别的预订,拷贝对象在“待出租”状态创建,否则在“保留”状态创建。