答案:
参考答案:
问题1:C1:PatronC2:BookC3:CatalogC4:CheckoutSessionController
问题2:M1:getForCheckOutM2:isFacultyM3:circulatesM4:recordBookLoan
问题3:解答:策略模式。策略模式定义了一系列算法,并将每个算法封装起来,而且使它们可以相互替换。策略模式让算法独立于使用它们的客户而变化。适用于需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其他方式来实现
解析:
本题属于经典的考题,主要考查面向对象分析方法以及UML类图和通信图的相关知识。
问题1:说明中给出了一个具体用例的详细描述,给出了其中的一个系统操作"checkoutbookID)(借书)"的通信图,需要考生利用通信图中的信息来补充类图中缺失的部分。通信图(communicationdiagram)强调收发消息的对象的结构组织,在早期的版本中也被称作协作图。通信图强调参加交互的对象的组织。产生一张通信图,首先要将参加交互的对象作为图的顶点,然后把连接这些对象的链表示为图的弧,最后用对象发送和接收的消息来修饰这些链。这就提供了在协作对象的结构组织的语境中观察控制流的一个清晰的可视化轨迹。消息checkOut(bookID)的接收者是类CheckoutSessionController的对象,说明类CheckoutSessionController中应该包含这一方法,否则无法响应该条消息。由图3-1可知,C4处所代表的类应该是CheckoutSessionController。消息find(bookID)的接收者是类Book,同理,由图3-1可知,C2处对应的类应该是Book。根据用例描述,图书信息是包含在图书目录中,所以C3处对应的类应该是Catalog,C1处对应的就应该是Patron了。
问题2:图3-1填充完整之后,图3-2的空缺就比较容易填写了。在通信图中,对象之间传递的消息就对应着接收对象中的方法。M1对应的就是类Catalog中的方法,由图3-1可知,M1对应的是getForCheckOut。M3对应的应该是类Book中的方法。由图3-1可知,Book中有3个方法,find和checkOut已经出现在通信图上了,所以M3应该是circulates。M2和M4是类Patron中的方法。Patron中有2个方法。通信图中的消息是有序号的,这个序号表示了消息的时间顺序,也就是说发送M2的时间要早于消息M4,因此必须区分类Patron中两个方法使用的先后顺序。在用例描述中特别指出:图书的归还时间与读者的身份有关。计算还书及借书费用时,需先确定读者的身份,因此方法isFaculty应该先被调用,所以M2对应isFaculty,M4对应recordBookLoan。
问题3:本题在设计类时使用到了策略模式。策略模式定义了一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化。策略模式的结构如下图所示。
其中:
●Strategy(策略)定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。
●ConcreteStrategy(具体策略)以Strategy接口实现某具体算法。
●Context(上下文)用一个ConcreteStrategy对象来配置;维护一个对Strategy对象的引用;可定义一个接口来让Strategy访问它的数据。
Strategy模式适用于:
●许多相关的类仅仅是行为有异。"策略"提供了一种用多个行为中的一个行为来配置一个类的方法。
●需要使用一个算法的不同变体。例如,定义一些反应不同空间的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。
●算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
●一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,将相关的条件分支移入它们各自的Strategy类中,以代替这些条件语句。