设计模式之策略模式

在设计一款鸭子游戏时,通过策略模式解决不断新增鸭子类型带来的代码维护难题。原本使用继承的方式导致每次添加新鸭子都需要检查并重写方法。策略模式提出将行为如叫声和飞行提取为独立策略类,允许动态组合鸭子的行为。通过设置方法,鸭子可以灵活改变叫声和飞行方式,实现行为的动态化。这种方式减少了代码耦合,提高了代码的可扩展性。
摘要由CSDN通过智能技术生成

策略模式

假设你是一名程序员,要设计一款鸭子游戏;

目前有两种鸭子,

一种鸭子特征为会呱呱叫、游泳、外观为红色的头

另一种鸭子特征为会呱呱叫、游泳、外观为绿色的头

作为一个资深程序员,首先你就考虑到了以后可能还会出现其他颜色的鸭子,所以你想到了继承,这样以后即使出现黑头鸭的话只需要继承一下Duck然后在类中单独修改display()即可,甚至出现叽叽叫的鸭子,不会游泳的鸭子,都在子类中进行单独修改即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oiQ6ICeB-1623150382735)(C:\Users\Administrator.DESKTOP-GE4QENT\AppData\Roaming\Typora\typora-user-images\image-20210608182944041.png)]

很快,继承的鸭子种类越来越多,新加入了不会游泳鸭与叽叽叫的橡胶鸭

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bzSW1QRU-1623150382741)(C:\Users\Administrator.DESKTOP-GE4QENT\AppData\Roaming\Typora\typora-user-images\image-20210608182915597.png)]

突然有一天,老板说,为了显示我们公司的与众不同,我们要让所有的鸭子飞起来,这当然难不倒你,你只需要在父类Duck中加入fly()方法即可让所有类型的鸭子都飞起来,你可真是个小机灵鬼,不过你发现橡胶鸭子应该是不会飞的,这也难不倒你,只需要在橡胶鸭类中重写一下fly方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oraKs3o6-1623150382743)(C:\Users\Administrator.DESKTOP-GE4QENT\AppData\Roaming\Typora\typora-user-images\image-20210608182839060.png)]

不过很快你又发现,每次出现新类型的鸭子,你都需要去检查一下新鸭子与父类鸭子方法的不同,然后去重写方法,这同样使你很痛苦,那么有什么方法能够摆脱这种困扰呢?

首先我们分析问题,为什么我们会如此困扰?因为我们一开始就在父类中明确了鸭子的基本行为,这就导致我们每次产生新类型的鸭子时都需要去与父类鸭子行为做对比进行重写与覆盖,怎么才能够灵活任意的改变鸭子的行为,策略模式告诉了我们答案。

如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

假设在所有的鸭子类型中,他们区别最大的地方在于叫法与飞行(其他方面也可以),那么我们可以将叫法与飞行从Duck类中取出来,建立一组新类来代表每个行为

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ygYYZXS-1623150382744)(C:\Users\Administrator.DESKTOP-GE4QENT\AppData\Roaming\Typora\typora-user-images\image-20210608185932081.png)]

认真对比一下叫法与飞行的变化,我们可以给鸭子类型任意的组合飞行方法与叫法,我们不再关注新类型鸭子与父鸭子的区别,只需要关注新鸭子是怎么飞的与是怎么叫的然后组合即可(如果你想,也可以抽象出外观与游泳)

最后,如果你想让鸭子的行为变的动态起来,在Duck类中加入set方法即可,这样便可以动态的去改变鸭子的行为,今天呱呱叫,明天叽叽叫,后天嘎嘎叫,随你设定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值