策略模式Strategy
1. 定义
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
2.结构图
Strategy:策略接口,用来约束一系列具体的策略算法。Context使用这个接口来调用具体的策略实现定义的算法。
ConcreteStrategy:具体的策略实现,也就是具体的算法实现。
Context:上下文,负责和具体的策略类交互。通常上下文会持有一个真正的策略实现,上下文还可以让具体的策略类来获取上下文的数据,甚至让具体的策略类来回调上下文的方法。
3. 本质
策略模式的本质:分离算法,选择实现。
4.Code Demo
Strategy.java
package org.fool.strategy;
public interface Strategy {
public int calculate(int a, int b);
}
AddStrategy.java
package org.fool.strategy;
public class AddStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a + b;
}
}
SubtractStrategy.java
package org.fool.strategy;
public class SubtractStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a - b;
}
}
MultiplyStrategy.java
package org.fool.strategy;
public class MultiplyStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a * b;
}
}
DivideStrategy.java
package org.fool.strategy;
public class DivideStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a / b;
}
}
Environment.java
package org.fool.strategy;
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);
}
}
Client.java
package org.fool.strategy;
public class Client {
public static void main(String[] args) {
Strategy addStrategy = new AddStrategy();
Environment environment = new Environment(addStrategy);
System.out.println(environment.calculate(3, 2));
Strategy substractStrategy = new SubtractStrategy();
environment.setStrategy(substractStrategy);
System.out.println(environment.calculate(3, 2));
Strategy multiplyStrategy = new MultiplyStrategy();
environment.setStrategy(multiplyStrategy);
System.out.println(environment.calculate(3, 2));
Strategy devideStrategy = new DivideStrategy();
environment.setStrategy(devideStrategy);
System.out.println(environment.calculate(3, 2));
}
}