策略模式的定义
----定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
----策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。
策略模式的组成
-----抽象策略角色:策略类,通常由一个接口或者抽象类实现
-----具体策略角色:包装了相关的算法和行为
-----环境角色:持有一个策略类的引用,最终给客户端调用
策略模式的实现
-----策略模式的用意是针对一组算法,将每一个算法封装到具体共同接口的独立的类中,从而使得它们可以相互替换。
-----策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。
-----环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改不会影响环境和客户端。
策略模式的缺点
----1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
----2.造成很多的策略类。
解决方案
-----采用工厂方法
用一个实例来理解策略模式。
————抽象策略角色,即策略类。定义一个接口,Strategy
public interface Strategy {
public int calculate(int a,int b);
}
————具体策略角色。定义了四个类,分别是加减乘除
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 DivideStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a / b;
}
}
接着定义一个环境角色,持有策略类的一个引用。
public class Environment {
private Strategy strategy;
public Environment(Strategy strategy) {
this.strategy = strategy;
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(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();
Environment environment = new Environment(addStrategy);
System.out.println(environment.calculate(3,4));
Strategy subtractStrategy = new SubtractStrategy();
environment.setStrategy(subtractStrategy);
System.out.println(environment.calculate(3,4));
Strategy divideStrategy = new DivideStrategy();
environment.setStrategy(divideStrategy);
System.out.println(environment.calculate(3,4));
Strategy multiplyStrategy = new MultiplyStrategy();
environment.setStrategy(multiplyStrategy);
System.out.println(multiplyStrategy.calculate(3,4));
}
}