Java设计模式实践:从鸭子模拟开始

4星 · 超过85%的资源 需积分: 10 7 下载量 19 浏览量 更新于2024-07-30 收藏 1.94MB PDF 举报
"Java设计模式初探:模拟鸭子游戏的演变" 在Java编程中,设计模式是一种在特定场景下解决常见问题的经验总结,它提供了一种可复用的、结构化的解决方案。在这个例子中,我们看到的是一个基于对象的鸭子模拟游戏,SimUDuck,其中使用了面向对象(OO)设计原则。系统的基础架构是通过一个鸭子基类(Duck)以及其多个子类(如MallardDuck, RedheadDuck等)来实现的。 首先,基类Duck包含了鸭子共有的行为,如quack()(呱呱叫)、swim()(游泳)和display()(显示外观)。display()方法根据不同的鸭子类型有不同的实现,体现了多态性,这是面向对象的一个核心概念。每个子类负责定义自己特有的display()行为,展现不同的外观特征。 然而,随着业务需求的变化,游戏需要增加新的功能——让鸭子飞翔(fly())。最初,Joe简单地在Duck类中添加了fly()方法,假设所有鸭子都能飞行。这样,所有子类都将继承这个fly()方法,实现简单继承。但问题在于,并非所有鸭子都能飞,比如橡皮鸭子。这种情况下,继承带来的问题显现出来,即“继承是为了复用,但在维护时可能导致不完美的结果”。 Joe的设计没有考虑到所有鸭子都能飞的假设并不成立,这违背了设计模式中的开闭原则(Open-Closed Principle),即软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。正确的做法可能是使用接口或者策略模式,让鸭子是否能飞成为一个可插拔的行为,而不是硬编码在基类中。 如果使用接口,可以创建一个IFlyable接口,只有能飞的鸭子实现这个接口。这样,橡皮鸭子就不需要实现这个接口,保持其原有行为。另一种方式是使用策略模式,定义一个FlyBehavior接口,包含fly()方法,鸭子类持有FlyBehavior的一个实例,可以根据鸭子类型动态改变飞行行为。 这个案例展示了在实际开发中如何遇到问题并逐步意识到设计模式的重要性。设计模式提供了在面对类似问题时的通用解决方案,比如工厂模式用于创建对象,观察者模式用于事件驱动,适配器模式用于兼容不同接口等。掌握这些模式可以帮助开发者编写出更加灵活、可维护的代码,适应不断变化的需求。