策略模式实战 - 鸭展

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

文章目录

红头鸭与绿头鸭

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

橡皮鸭和诱饵鸭

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

用接口代替继承

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

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

组合关系与策略模式

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

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

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

完整类图:

相关推荐
互联网散修1 天前
零基础鸿蒙应用开发第二十八节:商品排序体系之工厂与策略模式
策略模式·鸿蒙
stevenzqzq1 天前
架构设计深度解析:策略模式 + 抽象工厂在UI适配中的高级应用
ui·策略模式
tiger从容淡定是人生5 天前
可审计性:AI时代自动化测试的核心指标
人工智能·自动化·项目管理·策略模式·可用性测试·coo
都说名字长不会被发现6 天前
模版方法 + 策略模式在库存增加/扣减场景下的应用
策略模式·模板方法模式·宏命令·策略聚合·库存设计
默|笙6 天前
【Linux】进程概念与控制(2)_进程控制
java·linux·策略模式
枫叶林FYL7 天前
Agent/Teakenote 系统(Swarm 架构)深度技术报告
架构·策略模式
苏渡苇8 天前
枚举的高级用法——用枚举实现策略模式和状态机
java·单例模式·策略模式·枚举·状态机·enum
harder32110 天前
Swift 面向协议编程的 RMP 模式
开发语言·ios·mvc·swift·策略模式
skywalk816311 天前
esxi8 虚拟机中怎么安装mac os(纯AI回答,未实践)
策略模式·esxi
廖圣平11 天前
从零开始,福袋直播间脚本研究【八】《策略模式》
开发语言·python·bash·策略模式