策略模式通常是將一个系列的算法包装到一系列的策略类里面管理,一個策略类管理一个算法,
涉及角色:
- 环境角色:持有一个策略角色的引用,是真实与调用者打交道的角色
- 抽象策略角色:一般是一个接口或者抽象类,定义所有策略类的接口
- 真实策略角色:真正包装不同算法的类,通常都存在多个这样的角色
本质:
- 算法分离,选择实现
场景: 你是一个服装批发商,针对不同的客户会报出不同的价格(这种情况很常见),
现在有4个人要从你这里批发服装- 客户A: 50件
- 客户B: 200件
- 客户C: 800件
- 客户D: 2000件
/**抽象策略角色*/
public interface Strategy{ double getPrice(double price);}
//真实策略角色:购买1 ~ 100件的客户
public class CommonCustomer0To100 implements Strategy {
@Override
public double getPrice(double price){
//95折,这里是具体算法,例子只是一个简单乘法运算,完全可以想象成一个复杂的算法,最终返回结果
return price * 0.95;
}
}
//真实策略角色:购买100 ~ 500件的客户
public class CommonCustomer100To500 implements Strategy {
@Override
public double getPrice(double price){
return price * 0.9;
}}
//真实策略角色:购买5 ~ 1000件的客户
public class CommonCustomer500To1k implements Strategy {
@Override
public double getPrice(double price){
return price * 0.8;
}
}
//真实策略角色:购买1000 ~ 5000件的客户
public class CommonCustomer1kTo5k implements Strategy {
@Override
public double getPrice(double price){
return price * 0.7;
}
}
/**真实和调用者打交道的角色*/
public class StrategyContext{
private Strategy strategy; //会引用一个真实策略角色
public StrategyContext(Strategy strategy){
this.strategy = strategy;
}
//报价
public void printPrice(double s){
System.out.println(strategy.getPrice(s));
}
}
上面分别定义了抽象策略角色、多个真实策略角色以及上下文角色
在使用中:
- 当客户A前来购买:
//调用者访问,使用策略模式需要调用者知道全部的真实策略类,比如//当客户A前来,调用者知道,需要使用CommonCustomer0To100 类型
Strategy sty = new CommonCustomer0To100();
//创建持有策略角色的上下文,这里持有角色是可选的
StrategyContext ctx = new StrategyContext(sty);
//此时对于A客户会报出的价格
ctx.printPrice(1000);
- 当客户D前来购买:
//D客户前来 。。。
Strategy sty = new CommonCustomer1kTo5k();
StrategyContext ctx = new StrategyContext(sty);
ctx.printPrice(1000); //报价