目录
前言
如果你看到了这篇文章,想必你也经了解什么是设计模式和设计模式的重要性,但你要知道,不是说你看明白了一个设计模式的巧妙就是学会了这个模式,设计模式是没有标准代码实现的,它是一种思想,你需要印在自己的脑子中,当出现一个开发场景,能够贴合某个或某些模式的设计场景,你能够快速的做出反应,来使用某个或某些设计模式去做开发,那你才是真的学会了设计模式,所以说不要忽视设计模式的使用场景!
策略模式详解
策略模式定义
首先来说一下策略模式的标准定义,策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需要修改客户端代码。
策略模式案例
想必看了定义之后也是云里雾里,啥是算法族,怎么就不修改客户端代码了?不要紧,来看个书中的例子,你就悟了。
你是一个牛马程序员,最近在做一个“鸭子”游戏,原来只是鸭子在池塘里面叫,现在由于大环境激烈的竞争,你们公司想要创新,产品说你给鸭子加一个新功能,让他们“飞起来”,你接到任务,看了一下类图说:飞起来是吧,搞一个新的方法加到父类,大功告成!欣赏一下类图。
你以为会被评为有技术的牛马,但是晚上你就接到了电话,发!木头鸭子怎么也飞起来了,限你十分钟抓紧把bug改完。不急不急,先去CSDN逛逛,奥奥奥,原来新增了一个木头鸭子类,但是它不会飞,又继承了父类的fly方法,那怎么解决呢,你这回仔细的想了一下,怎么改才能保证新增鸭子和新增叫声、行为都可以很好的维护和扩展并且不会出现bug呢?
设计原则一:将类中的不变与变的属性拆开设计,并将变的部分单独封装,不去影响不变的部分。
设计原则二:针对接口编程,而不是实现编程。
在这个场景中,变的属性就是飞行和叫的行为,所以说有的时候更应该跳脱,不是说行为就只能封装成方法。你开始重新设计类图,将两个行为拿了出来,做了单独的接口(父类也行,只是没有属性设为接口更好),如果说有新的行为只需要实现接口就好了,相比之前的设计,现在更符合设计原则。
接下来如何将行为接口与“鸭子”联系起来呢?博主博主,还有没有简单好用的设计原则推荐推荐呢,有的有的,那就是多用组合,少用继承,组合算是继承的另一种表现形式,更好的是富有弹性。怎么个组合方式请看类图:
回过头来再看策略模式的定义,策略模式定义了一系列算法或策略,在上面的场景中也就是各种各样的飞行行为和叫声行为,通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需要修改客户端代码,其实这也是多用组合而不是继承的设计原则,每次出现新的鸭子类时,只需要通过set方法传入对应的具体行为,而不需要做任何的代码修改,这样维护和扩展都得到了满足,这就是策略模式的巧妙!恭喜你已经学会了策略模式!
总结
还是开头的话,不仅要学会巧妙,更要学会使用场景,快去看看你的项目哪里能够使用策略模式吧!我看的书是Head First 设计模式,有时间的同学也可去读一读,后续的设计模式也会持续更新,有兴趣点个关注吧!