问答题 阅读下列说明和C++代码,在 (n) 处填入适当的字句。
[说明]
某软件公司现欲开发一款飞机飞行模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征。需要模拟的飞机种类及其特征如表10.4所示。
表10.4飞机种类及特性
飞机种类 起飞特征 飞行特征
直升机(Helicopter) 垂直起飞(VerticalTakeOff) 亚音速飞行(SubSonicFly)
客机(AirPlane) 长距离起飞(LongDistanceTakeOff) 亚音速飞行(SubSonicFly)
歼击机(Fighter) 长距离起飞(LongDistanceTakeOff) 超音速飞行(SuperSonicFly)
鹞式战斗机(Harrier) 垂直起飞(VerticalTakeOff) 超音速飞行(SuperSonicFly)
为支持将来模拟更多种类的飞机,采用策略设计模式(Strategy)设计的类图如图10.11所示。
【正确答案】(1) FlyBehavior* flyBehavior (2) TakeOffBehavior* takeOffBehavior
(3) flyBehavior->fly() (4)takeOffBehavior->takeoff()
(5) SubSonicFly() (6) VerticaITakeOff() (7) Helicopter()
【答案解析】[要点解析] 本题考查了设计模式中的策略设计模式。
从本题的叙述中可以看出,存在4种不同的飞机类型,但每种飞机类型的起飞特征和飞行特征并不完全相同,这就使得我们很难采用比较直接的方法来实现重用。例如,定义一个抽象的飞机类,实现飞机的起飞特性,然后4种飞机直接重用该特征。但是,我们可以观察到,尽管飞机的起飞特征和飞行特征有所不同,有一点可以肯定的是,每一种飞机都具备了飞行特征和起飞特征。因此,可以抽象出一个飞机类,其中含有飞行特征与起飞特征,但关于两个特征的实现要单独抽取出来,所以又形成了FlyBehavior类和TakeOffBehavior类分别表示抽象的飞行和起飞特征,而这两个类的子类则分别实现不同的起飞和飞行特征,最终转化为,在创建一个具体的飞机时,给其配上不同的起飞特征和飞行特征即可。
本题中的空(1)和空(2)应该填写成员变量,根据类图可以得知,此处应该表示的是飞行和起飞特征变量,在C++中可以采用指针来表示。空(3)和空(4)处需要实现飞行与起飞特征,但AirCraft是抽象的类,所以把实现代理给指针变量。Helicopter类需要指定由父类继承而来的成员变量的初始值,因为Helicopter的特征是垂直起飞和亚音速飞行,因此生成这两个特征的对象,分别赋值给flyBehavior和takeOffBehavior变量。