优点:
- 算法可以自由切换
- 避免使用多重条件判断
- 扩展性良好
缺点:
- 策略类数量增多
- 所有策略类都需要对外暴露
角色:
- Context封装角色
- Strategy抽象策略角色
- ConcreteStrategy具体策略角色
Strategy抽象策略角色
package com.memory.strategy;
/**
* 抽象策略角色
*
* @author Administrator
*
*/
public interface Strategy {
/**
* 工作
*/
public void doWork();
}
ConcreteStrategy1和ConcreteStrategy2具体策略角色
package com.memory.strategy;
/**
* 具体策略角色1
*
* @author Administrator
*
*/
public class ConcreteStrategy1 implements Strategy {
@Override
public void doWork() {
// TODO Auto-generated method stub
System.out.println("具体策略1工作");
}
}
package com.memory.strategy;
/**
* 具体策略角色2
*
* @author Administrator
*
*/
public class ConcreteStrategy2 implements Strategy {
@Override
public void doWork() {
// TODO Auto-generated method stub
System.out.println("具体策略2工作");
}
}
Context封装角色
package com.memory.strategy;
/**
* 封装角色
*
* @author Administrator
*
*/
public class Context {
/**
* 抽象策略
*/
private Strategy mStrategy = null;
public Context(Strategy strate) {
// TODO Auto-generated constructor stub
this.mStrategy = strate;
}
/**
* 封装后,策略方法
*/
public void onAnyWork() {
this.mStrategy.doWork();
}
}
测试
// 策略模式
Strategy mStrategy = new ConcreteStrategy1();
// 声明上下文
Context context = new Context(mStrategy);
// 执行封装后的方法
context.onAnyWork();
context = new Context(new ConcreteStrategy2());
// 执行封装后的方法
context.onAnyWork();
///输出
启动应用成功!开启美好的一天
具体策略1工作
具体策略2工作