一、意图
定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
二、适用性
三、组成
——抽象策略(Strategy)角色:定义了所有算法的一个公共接口,各种不同的算法(即具体策略)以不同的方式实现这个接口,一般使用接口或抽象类实现。
——具体策略(Concrete Strategy)角色:提供了具体的算法实现。
——环境(Context)(或应用场景、上下文)角色:内部维护一个策略类的实例,可在运行时动态设定算法(具体策略),负责跟Strategy之间的交互和数据传递。
四、结构
五、简单实现
以实现整数的加减乘除为例,定义四种具体策略:加、减、乘、除。
(1)抽象策略(Strategy)角色:
public interface Strategy
{
public int calculate(int a,int b);
}
(2)四种具体策略(Concrete Strategy):
“加”策略:
public class AddStrategy implements Strategy
{
@Override
public int calculate(int a, int b)
{
return a+b;
}
}
“减”策略:
public class SubtractStrategy implements Strategy
{
@Override
public int calculate(int a, int b)
{
return a-b;
}
}
“乘”策略:
public class MultiplyStrategy implements Strategy
{
@Override
public int calculate(int a, int b)
{
return a*b;
}
}
“除”策略:
public class Dividetrategy implements Strategy
{
@Override
public int calculate(int a, int b)
{
return a/b;
}
}
(3)环境(Context)角色:
public class Context
{
//持有一个策略类的引用
private Strategy strategy;
public Strategy getStrategy()
{
return strategy;
}
//以便于动态设置具体策略
public void setStrategy(Strategy strategy)
{
this.strategy = strategy;
}
public Context(Strategy strategy)
{
this.strategy = strategy;
}
public int calculate(int a,int b)
{
return strategy.calculate(a, b);
}
}
测试:
public class Client
{
public static void main(String[] args)
{
Strategy addStrategy=new AddStrategy();
Context context=new Context(addStrategy);
int result=context.calculate(10, 7);
System.out.println(result);
Strategy multiplyStrategy=new MultiplyStrategy();
//动态设置算法
context.setStrategy(multiplyStrategy);
result=context.calculate(10, 7);
System.out.println(result);
}
}
六、策略模式的优缺点
1.优点
(1)提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。
(2)避免了程序中使用多重条件转移语句来选择不同的行为(策略),将行为封装在一个个独立的Strategy类中消除了这些条件语句。使系统更灵活,并易于扩展。
(3)遵循了封装变化、多用组合少用继承、针对接口编程等面向对象设计的原则。
2.缺点
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
(2)Strategy和Contex t之间的通信开销,有时Context会创建和初始化一些ConcreteStrategy永远不会用到的参数。
(3)每一个策略(算法)都对应一个策略类,增加了需要维护的类的数量。
解决办法:使用工厂方法模式。
七、设计原则
(1)封装变化
(2)多用组合,少用继承
(3)针对接口编程,不针对实现编程
关于这三个设计原则的体现,可以参考《HeadFirst设计模式》使用策略模式设计鸭子。
转载请注明出处:http://blog.youkuaiyun.com/jialinqiang/article/details/8870060