设计模式之策略模式
策略模式,属于行为型设计模式,用于在运行时更改一个类的行为或其算法。
定义:定义一系列算法类,将每一个算法封装起来,并让它们可以相互转换,让算法独立于使用它的客户而变化。
问题描述:在有多种算法相似的情况下,使用if...else所带来的复杂和难以维护的问题。
解决方案:将这些算法封装成一个一个的类,任意地替换。
结构图:
举个栗子:将一个电影票折扣的故事。。。
电影院中,电影票针对不同的人群有不同的优惠,比如团购票会优惠十元,学生票是八折,儿童票半价和VIP票是四折等,不同的优惠就是不同的策略,我们可以使用策略模式对电影院打折方案进行实现,具体实现方式如下:
1. 新建一个抽象策略类Discount,它是一个接口,声明了一个打折方法。代码如下:
2. 分别新建上述不同的具体策略类,均实现接口中声明的方法。代码如下:
其他具体策略类相同,略。
3. 新建一个电影票类MovieTicket,它持有一个对抽象策略类Discount的实例的引用。代码如下:
4. 使用策略模式,实现电影院针对不同人群的打折方案。代码如下:
5. 运行后的效果,如下:
以上可知,如果需要新增新的打折方式,我们无需修改原代码,只要增加一个新的折扣类作为抽象折扣类的子类,实现在抽象折扣类中声明的打折方法,将原有的具体折扣类替换成新的折扣类即可,完全符合开闭原则。
优点:
1. 符合开闭原则;
2. 提供了管理相关的算法族的方法;
3. 避免了多重条件选择语句。
缺点:
1. 会产生很多具体的策略类,增加设计和维护的难度;
2. 无法同时使用多个策略类,只能使用其中的一种策略。
3. 使用者必须知道所有的策略类,并自行决定使用哪一个策略类。
适用场景:
1. 当一个系统需要动态地决定在几种算法中选择其中一种使用时;
2. 当一个对象有很多行为时,可以使用策略模式将这些行为转移到相应的具体策略类里,避免使用难以维护的多重条件选择语句。