策略模式实战 - 鸭展

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

文章目录

红头鸭与绿头鸭

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

橡皮鸭和诱饵鸭

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

用接口代替继承

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

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

组合关系与策略模式

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

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

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

完整类图:

相关推荐
丷丩4 天前
策略模式实战:GeoAI-UP中MVT发布器的可扩展架构设计
人工智能·架构·gis·策略模式·空间分析·geoai
码界奇点5 天前
基于策略模式的多数据源爬虫系统设计与实现
爬虫·python·毕业设计·策略模式·源代码管理·数据库系统
05候补工程师5 天前
【Python实战】告别杂乱脚本!基于SOLID原则与策略模式的 PDF转Word 批量处理系统
python·设计模式·pdf·word·策略模式
风筝在晴天搁浅8 天前
美团 手撕策略模式
策略模式
朗迹 - 张伟10 天前
用AI开发QT——Qt与Trae开发环境搭建
开发语言·qt·策略模式
A懿轩A10 天前
Ghostty:告别 Mac 毛坯终端,打造 2026 最丝滑的 Ghostty AI 开发驾驶舱——Claude Code 团队也在用
python·macos·策略模式
二哈赛车手11 天前
新人笔记---多策略搭建策略执行链实现RAG检索后过滤
java·笔记·spring·设计模式·ai·策略模式
geovindu12 天前
go: Strategy Pattern
开发语言·设计模式·golang·策略模式
jimy112 天前
一个夜间期权交易策略的评价
策略模式·程序员创富
harder32115 天前
RMP模式的创新突破
开发语言·学习·ios·swift·策略模式