引言
- 在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。
- 在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等
- 如果开发过程中存在很多条件判断然后使用不同的编码的时候(也就是if else ),也可以考虑使用策略模式,便于代码维护
定义与特点
定义
该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。
优点
- 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句。
- 提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的实现
- 对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法
- 把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。
结构组成
- 【抽象策略类Strategy】 定义一个接口,不同的算法针对这个定义都有不同的实现
- 【具体策略类Concrete Strategy】实现了 抽象策略类的 接口,提供具体的实现
- 【环境类Context】持有一个策略类的引用,最终给客户端调用
应用实例
实例一:做鱼
- CookingFish就是抽象策略类,定义好做鱼的接口
- 清蒸鱼和红烧鱼相当于策略的具体实现
- 厨房相当于做鱼的环境,有做鱼策略设置和获取的方法,也有做鱼的方法(调用具体策略实现的方法),给客户端调用。
策略模式的扩展
在一个使用策略模式的系统中,当存在的策略很多时,客户端管理所有策略算法将变得很复杂,如果在环境类中使用策略工厂模式来管理这些策略类将大大减少客户端的工作复杂度。