类中的type变量代表不同的客户群体,因此有不同的缴费率。因为对应于不同的客户群体,有不同的优惠收费包,例如FamilyPackage、FriendPackage和FamerPackage。方法computeFare(String num, String type)需要经常改变,原因是每个包都有不同的打折率,并且对于每个包计算费用的算法是不同的。这说明在方法computeFare(String num, String type)中,存在许多条件语句。很明显,本设计不符合开闭原则,请利用策略模式对以上的类进行重新设计,画出设计类图。 答:
client+main() : voidContext-ref : FarePackage+ComputeFare(in num : String, in type : string) : float11<
使用状态模式设计软件。在一个面向儿童的人/机对抗游戏中有两个角色,mood_guy代表计算机游戏软件,玩家为儿童。玩家可以容易地影响mood_guy。mood_guy有三个状态:愉快、恼怒和疯狂。当它在愉快的状态时,它将唱歌;当它在恼怒的状态时,它将告诉它的朋友,抱怨某事;当它在疯狂的状态时,它将故意损坏一些东西。mood_guy可以自动改变心情状态:如果玩家忽略它超过20秒,无论处于何种状态,mood_guy将自动进入愉快状态。mood_guy的状态也可以由玩家的行为而改变:如果它处于愉快状态,玩家给它一个酸梨,则它进入恼怒状态;如果它处于恼怒状态,玩家给它一个辣椒,它将进入疯狂状态;如果它处于疯狂状态,玩家给它一个香蕉,它将进入愉快状态。要求使用状态模式设计该问题,并且:(1)画出状态图;(2)画出设计类图,该类图中应该包含两个方法:act( )和changeMood( )。
18. 设计一个使用几种排序算法对整数进行排序的程序。该程序可以计算出每种排序算法的执行
时间,以便比较各种排序算法的速度。该程序可以支持插入排序(InsertionSort)、快速排序(QuickSort)、冒泡排序(BubbleSort)、堆排序(HeapSort)。请使用策略模式进行设计,画出设计类图。
19. 利用状态模式设计的Weather State的实例。在本例中,考虑天气状态。天气状态可以分
为:晴天状态(Sunny State),下雨状态(Rainy State),刮风状态(Windy State),下雪(Snowing State)。在晴天状态,阳光普照;在雨天状态乌云密布,下雨不停;在刮风状态,大风刮得天昏地暗;在下雪状态,大雪纷飞。用状态模式封装天气状态。为了表达天有不测风云的思想,假设天气状态是随机改变的,即在四种状态之间的切换是根本没有规律可循的,因此,考虑在抽象类WeatherState中的方法changeState(Context cxt)的实现中,使用能产生随机整数的Random类。因此,具体状态的改变,由抽象类WeatherState负责实现。请采用常规的状态模式进行设计,画出设计类图。 WeatherState -ctx: Context
state +createStateObj() Context +changeState(Context cxt ):void
-state: WeatherState +setState():String +getCurrentState():String +getState() +action(): String +doAction():void
SunnyState WindyState RainyState SnowingState +action():String +action(): String +act(): String +act(): String
+changeState() +changeState() +changeState() +changeState() +setState():String +setState():String +setState():String +setState():String
20. 随机生成一个整数矩阵,矩阵可以看做是聚合类型的数据。使用迭代器模式设计,对该
矩阵进行不同的遍历:(1)奇数遍历(OddIterator),访问并统计矩阵中的所有奇数。(2)偶数遍历(EvenIterator),访问并统计矩阵中的所有偶数。(3)斜对角线遍历(DiagonalIterator), 按照斜对角线迭代遍历矩阵。请应用迭代器模式进行设计,画出设计类图。
21.
室内温度控制软件设计。室内温度控制需要具备窗户、风扇、空调的自动开启与关闭功能。因此,该应用需要设计三个类,分别用于封装窗户、风扇、空调。请利用命令模式设计该应用,画出设计类图。
22. 下图所示是一个调用排序算法的设计图。在实现时,调用者Invoker通过条件判断语句调用
相应的排序算法,调用者Invoker和接收者Receiver之间是紧耦合的。
请使用命令模式在Invoker与Receiver之间进行解耦,设计相应的类,并绘制设计类图。