策略模式实战 - 鸭展

该示例出自著名的《HeadFirst》系列的《HeadFirst设计模式》图书的第一个设计模式。用一个鸭子展览的小应用,一步步揭示了如何引入和使用策略模式将示例改造的完美一些。

文章目录

红头鸭与绿头鸭

当鸭展应用中仅有红头鸭和绿头鸭时,我们从中总结出鸭子的共性行为,比如都会"嘎嘎"叫(quack)、游泳戏水(swim),因此我们将这些方法抽取到基类Duck中,这样子类继承过来直接使用即可。而外观的展示方法(display),红头鸭和绿头鸭展示出来不一样,需要子类自己实现,因此将Duck定义为一个抽象类,并提供抽象的display方法,由继承的子类自己负责实现。

橡皮鸭和诱饵鸭

现在鸭展丰富了新的类型,玩具类的鸭子。此时发现了继承的弊端,因为继承后的方法并不都是子类都具有的,此时就要考虑子类的覆盖。也就是说每引入一种新的类型的子类,都要评估其继承的方法,是直接沿用,还是在此基础上扩展还是直接完全覆盖。

用接口代替继承

Java语言的特性从C++摒弃了多继承,转而使用实现接口的形式来代替多继承。当需要设计的类具备某种行为,可以定义相应的接口,让子类自己实现接口即可。比如这里的鸭子,具备某种行为则实现相关的接口,而不具备时,不实现接口则避免了子类继承的方法重写。

需要注意的是,实现接口的场景要求具体的行为在每个具体类上不存在共性,如果存在共性,那么这个接口的实现逻辑其实是存在的重复的代码逻辑,代码逻辑冗余无法被复用,这是滥用接口导致的。此时我们应当考虑,如何将接口的实现逻辑进行复用,这就是接下来要引入的策略模式。

组合关系与策略模式

上面提到了过度依赖类的继承以及接口实现的一些弊端,最好的解决办法是:用组合关系代替过度的类继承和接口实现。

比如,这里的鸭子的各种行为使用组合的关系,在鸭子基类中定义相关行为的属性,属性类型为特定行为的接口,面向接口编程的本质是面向对象编程的多态机制的使用。因此因为接口的具体实现可以任意扩展,这种具体的可复用的行为的封装就是策略模式。

**如果子类不具备某种行为的策略,那也不是通过重写父类调用相关策略的方法,而是实现这种"不具备某种行为"这一策略。**比如橡皮鸭不会飞,则复用FlyNoWay的具体策略即可。

完整类图:

相关推荐
折哥的程序人生 · 物流技术专研1 小时前
第3篇:手写促销策略引擎(满减、打折、立减)
java·设计模式·策略模式·开闭原则·编程实战·扩充系列·促销引擎
杨运交2 小时前
[045][Crypto模块]设计一个可扩展的加解密框架:策略模式与工厂模式实战
linux·运维·策略模式
IT·陈寒4 小时前
macOS 安装 Claude Code 全流程
人工智能·macos·策略模式
折哥的程序人生 · 物流技术专研6 小时前
第4篇:模板方法 vs 策略模式,面试怎么选?
java·设计模式·策略模式·行为型模式·模版方法模式·扩充系列·继承v组合
折哥的程序人生 · 物流技术专研1 天前
第2篇:策略模式三大角色拆解与UML
java·设计模式·策略模式·uml·编程入门·行为型模式·扩充系列
XX風1 天前
VTK 策略模式详解:InteractorStyle、Mapper、Picker 与可替换算法
图形渲染·策略模式
大侠锅锅3 天前
第 4 篇:策略模式实践——用统一接口管理 Docker 容器、原生进程与 K3s Pod
docker·容器·边缘计算·策略模式·iot
智慧城市20304 天前
183页PPT,麦肯锡战略屋品牌屋营销模型:打通战略、品牌与供应链的落地闭环
策略模式·战略咨询·流程管理
智慧城市20304 天前
556页集团供应链、营销案例,从断裂到贯通:构建生产供应链、财务成本与营销数字化的四步战略落地闭环
策略模式
意法半导体STM3222 天前
【官方原创】如何为STM32CubeMX2配置Visual Studio Code配置方案
vscode·stm32·单片机·嵌入式硬件·策略模式·stm32cubemx·嵌入式开发