策略模式(Strategy pattern)
概念
策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法,并且由客户端决定调用哪个算法
本质
分离算法,选择实现
开发场景
1:JavaSE中GUI编程中,布局管理
2:Spring框架中,Resource接口,资源访问策略
3:java.servlet.http.HttpServlet#service()
案例(顾客打折优惠)
抽象策略类public interface Strategy {
public abstract double getPrice(double standardPrice);
}
具体策略类
public class NewCustomerFewStrategy implements Strategy{
public double getPrice(double standardPrice) {
System.out.println("新客户,小批量购买!不享受打折优惠!");
return standardPrice;
}
}
public class NewCustomerMuchStrategy implements Strategy{
public double getPrice(double standardPrice) {
System.out.println("新客户,大批量购买!享受8折优惠!");
return standardPrice * 0.8;
}
}
public class OldCustomerFewStrategy implements Strategy{
public double getPrice(double standardPrice) {
System.out.println("老客户,小批量购买!享受6折优惠!");
return standardPrice * 0.6;
}
}
public class OldCustomerMuchStrategy implements Strategy{
public double getPrice(double standardPrice) {
System.out.println("老客户,大批量购买!享受5折优惠!");
return standardPrice * 0.5;
}
}
策略交互类
/*
* 负责和具体策略交互---使得具体算法和客户端分离
*/
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
super();
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
//调度方法
public void getPrice(double price){
System.out.println("您的价格为:" + strategy.getPrice(price) + "元!");
}
}
客户端测试
public class Client {
public static void main(String[] args) {
Strategy s = new NewCustomerFewStrategy();
Context c = new Context(s);
c.getPrice(12.5);
Strategy s2 = new OldCustomerMuchStrategy();
c.setStrategy(s2);
c.getPrice(15.6);
}
}
console:
新客户,小批量购买!不享受打折优惠!
您的价格为:12.5元!
老客户,大批量购买!享受5折优惠!
您的价格为:7.8元!
UML类图