1.核心:对应于解决某个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或增加新的算法,由客户端决定调用哪个算法
2.角色:
<1>上下文对象:该类中实现了对抽象策略中定义的接口或抽象类的引用
<2>抽象策略对象:通常由一个接口或抽象类实现,给出所有的具体策略类所需的接口
<3>具体策略:封装了实现不同功能的不同算法
3.开发业务场景:
-javase中GUI编程中,布局管理
-spring框架中,Resource接口,资源访问策略
-javax.servlet.http.HttpServlet#service()中的doPost,doGet方法选择
4.示例代码:
<1>抽象角色
//抽象角色(定义具体策略应该实现的所有算法)
public interface Strategy {
double getPrice(double standardPrice);
}
<2>具体策略角色(算法族)
//具体策略角色
public class NewAndFewStrategy implements Strategy {
@Override
public double getPrice(double standardPrice) {
System.out.println("原价,不打折");
return standardPrice;
}
}
//具体策略角色2
public class NewAndManyStrategy implements Strategy {
@Override
public double getPrice(double standardPrice) {
System.out.println("大批量新用户,打9折");
return standardPrice*0.9;
}
}
//具体策略角色3
public class OldAndFewStrategy implements Strategy {
@Override
public double getPrice(double standardPrice) {
System.out.println("小批量老用户,打85折");
return standardPrice*0.85;
}
}
//具体策略角色4
public class OldAndManyStrategy implements Strategy {
@Override
public double getPrice(double standardPrice) {
System.out.println("大批量老用户,打8折");
return standardPrice*0.8;
}
}
<3>上下文对象
/**
* 上下文对象,持有对抽象策略角色的引用
* 负责和具体的策略类交互,这样就可以实现具体的算法和客户端调用的分离,使算法可以独立于客户端变化
* @author Administrator
*
*/
public class Context {
private Strategy strategy;
//构造器注入
public Context(Strategy strategy) {
super();
this.strategy = strategy;
}
//setter方法注入
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void printPrice(double standardPrice){
System.out.println("用户最终价格为:"+strategy.getPrice(standardPrice));
}
}
<4>客户端调用
//客户端
public class Client {
public static void main(String[] args) {
Strategy strategy=new OldAndFewStrategy();
Context context=new Context(strategy);
context.printPrice(100);
}
}
执行结果
小批量老用户,打85折
用户最终价格为:85.0
5.示例用类图: