策略模式
策略模式是一种非常简单的设计模式,其主要思想是设计一系列或一组算法并将每一个算法都封装起来,使他们之间可以互换,在需要执行的时候根据不同的需求执行不同的算法,java集合框架中的Collections.sort()方法就是一个典型的策略模式。如下图所示,其类结构图也比较简单:
策略模式涉及到三个角色:
Context封装角色:该角色起到承上启下封装作用 ,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
Strategy抽象策略角色:策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。
ConcreateStrategy具体策略角色:实现抽象策略中的操作。
示例代码如下:
package com.designpattern.strategy;
public class Test {
public static void main(String[] args) {
ConcreateStrategy1 strategy1 = new ConcreateStrategy1();
Context context = new Context(strategy1);
context.invoke();
ConcreateStrategy2 strategy2 = new ConcreateStrategy2();
context = new Context(strategy2);
context.invoke();
}
}
interface IStrategy {
void operator();
}
class Context {
private IStrategy strategy;
public Context(IStrategy strategy) {
this.strategy = strategy;
}
public void invoke() {
strategy.operator();
}
}
class ConcreateStrategy1 implements IStrategy {
@Override
public void operator() {
System.out.println("执行策略1");
}
}
class ConcreateStrategy2 implements IStrategy {
@Override
public void operator() {
System.out.println("执行策略2");
}
}
代码类结构图如下:
策略模式的优点
1.算法可以自由切换
2.避免多重条件判断:如果没有策略模式,想象一下会是怎么回事呢?一个策略家族有5个算法,一会用A策略,一会用B策略,怎么办呢?使用多重的条件判断?多重条件语句不易维护而且出错的几率很高。使用了策略模式后可以由其他模块决定采用何种策略。
3.扩展性良好。要在现有的系统中增加一个策略是很容易的事情,只要实现接口就可以了。
策略模式使用场景
1.多个类只有在算法或行为上稍有不同的场景;
2.算法需要自由切换的场景,如排序时可能从大到小,可能从小到大;