策略模式:让鸭子飞起来

4星 · 超过85%的资源 需积分: 10 14 下载量 92 浏览量 更新于2024-07-30 1 收藏 3.45MB PPT 举报
"策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。这份PPT详细介绍了策略模式的概念,通过模拟鸭子游戏的例子来阐述其应用。文档中提到,原本的游戏系统使用了继承的方式来设计各种类型的鸭子,如绿头鸭、红头鸭等,它们共享一些通用的行为如呱呱叫(quack)、游泳(swim)和展示外观(display)。然而,当需要增加飞行(fly)功能时,通过继承的方式导致所有鸭子包括不应该会飞的橡皮鸭也具备了飞行能力,从而暴露了设计的问题。" 策略模式的核心思想是定义一系列算法,并将每个算法封装起来,使它们可以互相替换。在这个例子中,每个鸭子的行为(如quack、swim、display和fly)可以被视为一个策略。如果这些行为是通过接口或抽象类定义的,那么就可以在运行时动态地选择或改变特定鸭子的行为。 在原始设计中,Duck类是一个抽象类,包含了quack、swim和display方法,各个具体的鸭子类型如MallardDuck和RedheadDuck继承自Duck并实现了display方法以展现不同的外观。然而,当Joe为了实现会飞的鸭子而将fly方法添加到Duck类中时,所有子类包括不应该飞行的橡皮鸭都继承了这个方法,这违背了面向对象设计的原则,即开闭原则(对扩展开放,对修改关闭)。 为了解决这个问题,可以使用策略模式。首先,创建一个IFlyBehavior接口,定义fly方法。然后,为每种飞行行为创建一个策略类,如FlyWithWings表示正常飞行,FlyNoWay表示不会飞行。在Duck类中,不再包含fly方法,而是包含一个IFlyBehavior类型的引用。在初始化鸭子对象时,根据鸭子类型设置相应的飞行策略。这样,即使橡皮鸭子实例化时指定了FlyNoWay策略,也不会表现出飞行行为,解决了原本的设计问题。 通过这种方式,策略模式提供了更大的灵活性,允许在运行时根据需要选择和更改行为,而无需修改现有类的结构。此外,它还降低了类之间的耦合,因为具体行为被封装在独立的策略类中,而不是硬编码在鸭子类中。这种模式广泛应用于需要动态切换算法或行为的场景,如游戏中的角色行为、财务计算规则、物流路径规划等。