一、问题描述
joe上班的公司做了一套成功的模拟鸭子的游戏:SimUDuck,游戏中会出现各种鸭子,一边游泳,一边呱呱叫,由于公司竞争压力加剧,必须重新设计鸭子(Duck)类,要求是:便于产生新的鸭子对象,可为鸭子添加新的行为,易于维护,动态设置行为。
二、类图
说明:
1.对各种鸭子的解释:
RedHeadDuck:红头鸭,可以用翅膀飞,呱呱叫。
RubberDuck:橡皮鸭,不会飞,吱吱叫。
ModelDuck:模型鸭,不会飞,呱呱叫。
DecoyDuck:诱饵鸭,不会飞,不会叫。
MallardDuck:野鸭,会用翅膀飞,呱呱叫。
2.Duck是各种鸭子的抽象超类,其内部持有FlyBehavior和QuackBehavior接口类型的引用,因为飞行行为和呱呱叫行为随鸭子的不用而不同,是变化的部分,所以将它们取出并“封装”起来,好让其他部分不会受到影响。
使用FlyBehavior和QuackBehavior接口类型便于以后增加新的飞行行为或呱呱叫行为,不会影响到既有的行为类,也不会影响使用行为的鸭子类。同样,这也可以让飞行行为和呱呱叫行为被其他对象复用,因为这些行为已经与鸭子类无关了,你也可以将其用在鸡和大鹅身上。
3.对飞行行为的解释:
FlyWithWings用翅膀飞。
FlyNoWay:不会飞。
FlyRocket