1.如果你期望封装一个操作,使其实现可以互相替换,可使用Strategy(策略)模式
2.举例
//策略抽象类
public abstract class Strategy {
abstract void doIt();
}
//策略A类
public class StrategyA extends Strategy{
@Override
void doIt() {
// TODO Auto-generated method stub
System.out.println("StrategyA do it");
}
}
//策略B类
public class StrategyB extends Strategy{
@Override
void doIt() {
// TODO Auto-generated method stub
System.out.println("StrategyB do it");
}
}
//策略管理者:根据传来的策略类来决定使用哪个策略
public class ContextManager {
private Strategy strategy;
public ContextManager(Strategy strategy) {
// TODO Auto-generated constructor stub
this.strategy = strategy;
}
public void doSomethings(){
strategy.doIt();
}
}
//测试类:需要用户知道具体拥有哪些策略类
public class Test {
public static void main(String[] args) {
Strategy sa = new StrategyA();
Strategy sb = new StrategyB();
ContextManager cma = new ContextManager(sa);
cma.doSomethings();
ContextManager cmb = new ContextManager(sb);
cmb.doSomethings();
}
}
//结果
StrategyA do it
StrategyB do it
3.总结:Strategy(策略模式)模块的意图在于把可选的策略或方案封装在不同的类中,并在这些类中实现一个共同的操作。通过将可选的策略封装在单独的类中,并让每个类都实现一个共同的操作,我们可通过该模式创建一系列整洁而又简单的代码,以此来完成对各种解决问题的方案的建模。
4.Strategy(策略)模式与State(状态)模式区别
4.1 在对状态进行建模的时候,状态迁移是一个重要的方面;而在对策略进行建模的时候,迁移与策略的选择并不相关。
4.2 Strategy(策略)模式可能允许客户选择或者提供一个策略,而State(状态)模式无需客户知道具体状态。
5.参考:http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html