1.是什么
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
2.有什么用
优点:
- 提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。
- 避免程序中使用多重条件转移语句,使系统更灵活,易于扩展。
缺点:
- 一个策略对应一个类,太多策略会造成类太多
3.怎么用
-
通用类图
strategy.PNG
示例代码
- 策略接口
public interface IStrategy {
public void handle();
}
- 策略实现类
public class FightStrategy implements IStrategy {
@Override
public void handle() {
System.out.println("fight!");
}
}
public class EscapeStrategy implements IStrategy {
@Override
public void handle() {
System.out.println("逃跑……");
}
}
- 环境类
public class Context {
private IStrategy strategy;
public void handleProblem() {
this.strategy.handle();
}
/**
* @return the strategy
*/
public IStrategy getStrategy() {
return strategy;
}
/**
* @param strategy
* the strategy to set
*/
public void setStrategy(IStrategy strategy) {
this.strategy = strategy;
}
}
- client类
public class Client {
public static void main(String[] args) {
// 当前环境来决定使用什么策略应对
Context env = new Context();
System.out.println("困难出现");
System.out.println("想想应对策略");
IStrategy fightstrategy = new FightStrategy();
System.out.println("想好策略");
env.setStrategy(fightstrategy);
System.out.println("应对问题");
env.handleProblem();
System.out.println("困难又出现");
System.out.println("想想应对策略");
IStrategy escape = new EscapeStrategy();
System.out.println("想好策略");
env.setStrategy(escape);
System.out.println("应对问题");
env.handleProblem();
}
}
网友评论