策略模式
策略模式是对象的行为模式,用意是对一组算法的封装。动态的选择需要的算法并使用
二.组成部分:
1.
环境角色:持有一个策略类引用
2.
抽象策略
3.
具体策略:相关的算法或操作
Context(应用场景):
1、需要使用ConcreteStrategy提供的算法。
2、 内部维护一个Strategy的实例。
3、 负责动态设置运行时Strategy具体的实现算法。
4、负责跟Strategy之间的交互和数据传递。
Context(应用场景):
1、需要使用ConcreteStrategy提供的算法。
2、 内部维护一个Strategy的实例。
3、 负责动态设置运行时Strategy具体的实现算法。
4、负责跟Strategy之间的交互和数据传递。
//抽象策略
public interface IStrategy {
/**策略方法*/
public abstract double add();
}
//具体策略,这里我以两个具体策略为例
public class ConcreteStrategy1 implements IStrategy {
/**示意性算法*/
public double add() {
System.out.println(this.getClass().getName() + "的加法运算");
return 0;
}
}
public class ConcreteStrategy2 implements IStrategy {
public double add() {
System.out.println(this.getClass().getName() + "的加法运算");
return 0;
}
}
//环境角色
public class Context {
/**环境角色类*/
private IStrategy strategy;
public Context(IStrategy strategy) {
this.strategy = strategy;
}
/**策略方法*/
public double add() {
this.strategy.add();
return 0;
}
}
//客户端调用
public class Main {
/**
*@paramargs
*/
public static void main(String[] args) {
Context context = new Context(new ConcreteStrategy1());
context.add();//执行算法1
context = new Context(new ConcreteStrategy2());
context.add();//执行算法2
}
}
5.执行结果:
com.eekq.strategy.ConcreteStrategy1的加法运算
com.eekq.strategy.ConcreteStrategy2的加法运算
6.总结
优点:动态改变算法或行为
缺点:客户端必须知道所有的策略类,并自行决定使用哪一个策略类,必须对每一个算法了解