问题 问答题

【说明】 某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如表10-7所示: 表10-7

为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(Strategy)设计的类图如图10-12所示:

其中,Duck为抽象类,描述了抽象的鸭子,而类RubberDuck、MallardDuck、 CottonDuck 和 RedHeadDuck分别描述具体的鸭子种类,方法fly()、quack()和display()分别表示不同种类的鸭子都具有飞行特征、发声特征和外观特征;接口FlyBehavior与 QuackBehavior分别用于表示抽象的飞行行为与发声行为;类FlyNoWay与FlyWithWings分别描述不能飞行的行为和用翅膀飞行的行为;类Quack、Squeak与QuackNoWay分别描述发出“嘎嘎”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下代码中的空缺。【Java代码】 (1) FlyBehavior{ public void fly(); }; (2) QuackBehavior{public void quack(); }; class FlyWithWings implements FlyBehavior{ public void fly(){System.out.println(“使用翅膀飞行!”);} }; class FlyNoWay implements FlyBehavior{ public void fly(){System.out.println(“不能飞行!”);} }; class Quack implements QuackBehavior{ public void quack(){System.out.println(“发出\‘嘎嘎\’声!”); } }; class Squeak implements QuackBehavior{ public void quack(){System.out.println(“发出空气与橡皮摩擦声 !”); } }; class QuackNoWay implements QuackBehavior{ public void quack(){System.out.println(“不能发声!”);} }; abstract class Duck{ protected FlyBehavior (3) ; protected QuackBehavior (4) ; public void fly(){ (5) ; } public void quack() { (6) ;}; public (7) void display(); }; class RubberDuck extends Duck{ public RubberDuck(){flyBehavior=new (8) ;quackBehavior=new (9) ; } public void display(){/*此处省略显示橡皮鸭的代码*/ } }; //其他代码省略

答案

参考答案:

解析:(1) interface(2) interface(3) flyBehavior(4) quackBehavior(5) flyBehavior.fly()(6) quackBehavior.quack()(7) abstract(8) FlyNoWay()(9) Squeak()

[分析]: FlyBehavior与QuackBehavior分别表示抽象的飞行特征,它们仅仅规定了接口,因此空(1)和(2)应该填写interface;Duck是各种鸭子种类的基类,而每一种鸭子都具有飞行特征和发声特征,这两种特征分别通过FlyBehavior和QuackBehavior来实现,因此空(3)和(4)处应该为这两个类的对象引用,Duck的飞行动作和发声动作通过abstract与其飞行特征对象和发声特征对象相关,所以,直接调用这两个类的飞行和发声动作即可。因为每一种Duck的显示特征是不相同的,因此display方法应该为抽象的方法;每一种具体的鸭子种类的飞行特征和发声特征是不同的,因此,在每一种具体鸭子类的构造函数中需要指定其具有的飞行特征和发声特征。表10-7已经指出了RubberDuck的这两种特征分别为FlyNoWay和Squeak,所以,通过构造相应类的对象来实现该特征。

选择题
单项选择题