介绍
针对算法做的封装,策略模式仅仅封装算法。准备一组算法,并将每一个算法封装起来,使得它们可以互换。策略模式并不决定在何时使用何种算法,在什么情况下使用哪种算法是由客户端决定的
示例demo
背景:不同的会员有不同的折扣打折
会员策略接口:
@FunctionalInterface
public interface MemberStrategy {
/**
* 计算方法
*/
double calculate(double price);
}
会员上下文:
public class Price {
private MemberStrategy memberStrategy;
// 根据传入的字符串等级,转换为对应的策略模式
public Price(String level) {
switch (level) {
case "A" :
memberStrategy = new PrimaryMemberStrategy();
break;
case "B" :
memberStrategy = new IntermediateMemberStrategy();
break;
case "C" :
memberStrategy = new AdvancedMemberStrategy();
break;
default:
memberStrategy = new PrimaryMemberStrategy();
break;
}
}
public double quotePrice(double price) {
return memberStrategy.calculate(price);
}
}
具体的会员策略:
/**
* 初级会员策略
**/
public class PrimaryMemberStrategy implements MemberStrategy {
@Override
public double calculate(double price) {
// 初级会员不打折
return price;
}
}
/**
* 中级会员策略
**/
public class IntermediateMemberStrategy implements MemberStrategy {
@Override
public double calculate(double price) {
// 中级会员打九折
return price * 0.9;
}
}
/**
* 高级会员策略
**/
public class AdvancedMemberStrategy implements MemberStrategy {
@Override
public double calculate(double price) {
// 高级会员打八折
return price * 0.8;
}
}
测试类:
public class StrategyTest {
@Test
public void primaryMemberStrategyTest() {
Price price = new Price("A");
System.out.println("初级会员价格:" + price.quotePrice(100));
}
@Test
public void intermediateMemberStrategyTest() {
Price price = new Price("B");
System.out.println("中级会员价格:" + price.quotePrice(100));
}
@Test
public void advancedMemberStrategyTest() {
Price price = new Price("C");
System.out.println("高级会员价格:" + price.quotePrice(100));
}
}
运行结果: