概述
行为模式,定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。
类图
角色
- 环境(Context)角色:
该角色也叫上下文角色,起到承上启下的作用,屏蔽高层模块对策略、算法的直接访问,它持有一个Strategy类的引用。 - 抽象策略(Strategy)角色:该角色对策略、算法进行抽象,通常定义每一个策略或算法必须具有的方法和属性。
- 具体策略(Concrete Strategy)角色:该角色实现抽象策略中的具体操作,含有具体的算法。
示例
Strategy.java
1 | public abstract Strategy{ |
ConcreteStrategy.java
1 | public class ConcreteStrategy extends Strategy{ |
Context.java
1 | public class Context{ |
应用
优点
- 策略模式提供了管理相关的算法族的办法。策略类的登记结构定义一个算法或行为族,恰当地使用继承可以把公共代码迁移到父类中,从而避免代码重复。
- 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为,如果不用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样算法或行为的使用者就和算法本身混在一起,从而不能再独立演化。
- 使用策略模式可以规避使用多重条件转移语句。
缺点
- 客户端必须知道所有的策略类,并自行解决使用哪一个策略类。
- 策略模式造成很多的策略类。
场景
- 多个类只是在算法或行为上稍有不同的场景。
- 算法需要自由切换的场景。
- 需要屏蔽算法规则的场景。