概述
策略模式(Strategy)定义了一个算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到使用算法的客户。
策略模式的结构组成如下所示:
角色组成
策略模式涵盖了3个角色,分别是上下文环境、基本的策略基类和具体的策略执行类。
1)上下文环境(Context)角色:持有一个Strategy的引用。
2)抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。 此角色给出所有的具体策略类所需的接口。
3)具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
代码举例
首先,定义一个策略基类(接口或者抽象类),这里我们就以《大话设计模式中的》这本书中的算法为例,个人觉得这个实例很好不需要再专门找其他的例子了。
/**
*策略模式基类
*/
abstract class BaseStrategy{
//算法方法
public abstract void algorithmInterface();
}
然后,再定义两个具体的策略模式执行类。
/**
*策略模式具体的执行类ConcreteStrategyA
*/
public class ConcreteStrategyA extends BaseStrategy{
//算法方法
@Override
public abstract void algorithmInterface(){
System.out.println("算法A的具体实现");
}
}
/**
*策略模式具体的执行类ConcreteStrategyA
*/
public class ConcreteStrategyB extends BaseStrategy{
//算法方法
@Override
public abstract void algorithmInterface(){
System.out.println("算法B的具体实现");
}
}
最后,我们再编写一个用来配置和维护一个BaseStrategy对象的上下文。
public class StrategyContext{
public BaseStrategy mStrategy;
public StrategyContext(BaseStrategy baseStrategy){
this.mStrategy = baseStrategy;
}
public void executeAlgorithm(){
this.mStrategy.algorithmInterface();
}
}
模式评价
策略模式就是将一系列完成相类似的工作的方法进行抽象。这样大家都继承自相同的抽象类,或者实现同样的接口,只是具体的实现上稍微有些差异。经过抽象,可以大大降低了各种算法的耦合性,提高了共性,便于集中管理。
本实例中,如果需要一个新的算法实现,那么只要新增一个具体的实现类,他继承策略基类,覆写其实现。既可以各种具体的实现类互不干扰,在实例化时也可以相互替换。充分体现了对修改关闭,对新增 开放的开闭原则。