策略模式
一、定义
定义一组算法,并将每个算法封装起来,使得它们之间可以相互替换。策略模式让算法的变化独立于使用它的客户端。
二、类图表示
三、实现
1、Strategy
package pattern.behavioral.strategy;
public abstract class Strategy {
public abstract void algorithmInterface();
}
package pattern.behavioral.strategy;
public class ConcreteStrategyA extends Strategy{
@Override
public void algorithmInterface() {
System.out.println("called ConcreteStrategyA.algorithmInterface()...");
}
}
package pattern.behavioral.strategy;
public class ConcreteStrategyB extends Strategy {
@Override
public void algorithmInterface() {
System.out.println("called ConcreteStrategyB.algorithmInterface()...");
}
}
package pattern.behavioral.strategy;
public class ConcreteStrategyC extends Strategy {
@Override
public void algorithmInterface() {
System.out.println("called ConcreteStrategyC.algorithmInterface()...");
}
}
2、Context
package pattern.behavioral.strategy;
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void contextInterface(){
strategy.algorithmInterface();
}
}
四、使用
package pattern.behavioral.strategy;
public class Client {
public static void main(String[] args) {
Context context = new Context(new ConcreteStrategyA());
context.contextInterface();
System.out.println();
context.setStrategy(new ConcreteStrategyB());
context.contextInterface();
System.out.println();
context.setStrategy(new ConcreteStrategyC());
context.contextInterface();
}
}
- 程序输出:
called ConcreteStrategyA.algorithmInterface()...
called ConcreteStrategyB.algorithmInterface()...
called ConcreteStrategyC.algorithmInterface()...
五、适用场合
-
需要在不同的情况下使用不同的策略,或是在未来还有可能用其他方式实现时
-
需要隐藏具体策略的实现,避免暴露给客户端复杂的具体实现细节
-
当多个相关的类只是行为不同,需要在运行时动态选择要执行的行为的时候
-
当一个类定义了多个行为,而且这些行为是在这个类的操作中以多个条件语句的形式出现时(将相关的条件分支移入各自的策略类中以代替条件语句)