策略模式:指的是对象具备某个行为,但是在不同的场景中,该行为有不同的实现算法。
策略模式使用的就是面向对象的继承和多态机制,从而实现同一行为在不同场景下具备不同实现。
策略模式本质:分离算法,选择实现。
主要解决
在有多种算法相似的情况下,使用 if...else 或 switch...case 所带来的复杂性和臃肿性。
优点
1)算法多样性,且具备自由切换功能;
2)有效避免多重条件判断,增强了封装性,简化了操作,降低出错概率;
3)扩展性良好,策略类遵顼 里氏替换原则,可以很方便地进行策略扩展;
使用场景
1、针对同一类型问题,有多种处理方式,每一种都能独立解决问题;
2、算法需要自由切换的场景;
3、需要屏蔽算法规则的场景;
策略模式的通用 UML 类图(如何画类图?类名,方法名,接口,类与类之间的关系)
从 UML 类图中,我们可以看到,策略模式 主要包含三种角色:
1)上下文角色(Context):用来操作策略的上下文环境,屏蔽高层模块(客户端)对策略,算法的直接访问,封装可能存在的变化;
2)抽象策略角色(Strategy):规定策略或算法的行为; 接口
3)具体策略角色(ConcreteStrategy):具体的策略或算法实现; 实现类
抽象策略类,具体策略实现。
public static void main(String[] args) {
//选择一个具体策略
IStrategy strategy = new ConcreteStrategyA();
//来一个上下文环境
Context context = new Context(strategy);
//客户端直接让上下文环境执行算法
context.algorithm();
}
class Context {
private IStrategy mStrategy;
public Context(IStrategy strategy) {
this.mStrategy = strategy;
}
public void algorithm() {
this.mStrategy.algorithm();
}
}
策略模式中的上下文环境(Context),其职责本来是隔离客户端与策略类的耦合,让客户端完全与上下文环境沟通,无需关系具体策略。