一、概念
1.1、定义
定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。让算法独立于使用它的客户而变化,即一个类的行为或其算法可以在运行时更改。
- Context,环境类:算法的使用者
- Strategy:,抽象策略类:定义策略的执行接口方法
- ConcreteStrategy,具体策略类:具体的算法设计中和执行者
1.2、解决的问题
问题分析
现实世界中,完成一项任务,往往可以选择不同的方式,每一种方式被称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。模式解决思路:将变化的算法策略抽象出策略类Strategy,使用面向对象的子类派生或接口实现来达到扩展改变的目的;在程序运行时候,根据具体需要指定具体策略ConcreteStrategy实例。
二、模式的应用和优缺点
2.1、应用场景
-
实例:
1、日志文件的本地存储方案,文件、数据库等
2、旅游出行交通方案,自行车、飞机、动车等
3、App的更多功能操作面板,基层微信、微博、朋友圈分享、点赞、评论、复制等功能入口。如下
4、在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
2.2、优缺点
优点:
1、提供一种管理相关的算法族的办法,可以灵活扩展算法,符合开闭原则
2、避免使用多重条件 if...else 判断
3、扩展性良好。缺点:
1、策略类会增多,可以结合享元模式进行优化
2、策略类对外暴露,即客户端必须知道所有的策略类,并自行决定使用哪一个策略类