策略模式 Strategry 特点:
该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。
优点
策略模式遵循了开闭原则,实现了代码的解耦合。在使用策略模式的时候,如果你想要拓展新策略,可以不改动任何旧逻辑,可以很方便的添加新逻辑。
缺点
维护过多策略类会比较麻烦,而且调用者必须清除每个策略类的区别等逻辑
实现
我们在这里模拟一下电商中的多种优惠业务来使用策略模式实现
StrategyModelDemo 模拟调用类
/**
* @program: demo
* @description: 策略模式demo
* @author: Kenny.Qiu
* @create: 2020-08-08 15:15
*/
public class StrategyModelDemo {
public static void main(String[] args) {
/**
* calculationType: 1-满减;2-团购;3-秒杀;其他-默认
*/
Integer calculationType = 1;
// 基于满减类型参数,获取策略计算实现类
DiscountCalculationFactory factory = new DiscountCalculationFactory();
DiscountCalculation strategy = factory.discountCalculation(calculationType);
// 封装了策略具体计算调用方法,简便用户操作调用
DiscountCalculationContext calculationContext = new DiscountCalculationContext();
calculationContext.setDiscountCalculation(strategy);
calculationContext.calculation();
}
}
DiscountCalculation 策略接口
/**
* @program: demo
* @description: 计算接口
* @author: Kenny.Qiu
* @create: 2020-08-08 15:20
*/
public interface DiscountCalculation {
/**
* 计算商品优惠价格
*/
void calculationDiscount();
}
DefaultDiscountCalculation 默认策略实现类
/**
* @program: demo
* @description: 默认优惠
* @author: Kenny.Qiu
* @create: 2020-08-08 15:28
*/
public class DefaultDiscountCalculation implements DiscountCalculation {
/**
* 计算商品优惠价格
*/
@Override
public void calculationDiscount() {
System.out.println("默认优惠计算策略模式");
}
}
FullReductionDiscountCalculation 满减策略实现类
/**
* @program: demo
* @description: 满减优惠
* @author: Kenny.Qiu
* @create: 2020-08-08 15:28
*/
public class FullReductionDiscountCalculation implements DiscountCalculation {
/**
* 计算商品优惠价格
*/
@Override
public void calculationDiscount() {
System.out.println("满减优惠计算策略模式");
}
}
GroupBuyDiscountCalculation 团购策略实现类
/**
* @program: demo
* @description: 团购优惠
* @author: Kenny.Qiu
* @create: 2020-08-08 15:28
*/
public class GroupBuyDiscountCalculation implements DiscountCalculation {
/**
* 计算商品优惠价格
*/
@Override
public void calculationDiscount() {
System.out.println("团购优惠计算策略模式");
}
}
SpikeDiscountCalculation 秒杀策略实现类
/**
* @program: demo
* @description: 秒杀优惠
* @author: Kenny.Qiu
* @create: 2020-08-08 15:28
*/
public class SpikeDiscountCalculation implements DiscountCalculation {
/**
* 计算商品优惠价格
*/
@Override
public void calculationDiscount() {
System.out.println("秒杀优惠计算策略模式");
}
}
DiscountCalculationFactory 优惠计算逻辑工厂
/**
* @program: demo
* @description: 优惠计算逻辑工厂
* @author: Kenny.Qiu
* @create: 2020-08-08 15:33
*/
public class DiscountCalculationFactory {
/**
* 根据优惠参数返回不同优惠计算策略逻辑
*
* @param calculationType 优惠类型
* @return 优惠计算策略逻辑
*/
public DiscountCalculation discountCalculation(Integer calculationType) {
System.out.println("优惠计算策略参数为:" + calculationType);
if (calculationType == 1) {
return new FullReductionDiscountCalculation();
} else if (calculationType == 2) {
return new GroupBuyDiscountCalculation();
} else if (calculationType == 3) {
return new SpikeDiscountCalculation();
} else {
return new DefaultDiscountCalculation();
}
}
}
DiscountCalculationContext 策略逻辑调用计算封装类
/**
* @program: demo
* @description: 策略逻辑调用计算封装类
* @author: Kenny.Qiu
* @create: 2020-08-08 15:46
*/
public class DiscountCalculationContext {
/**
* 优惠策略逻辑接口
*/
private DiscountCalculation discountCalculation;
public DiscountCalculation getDiscountCalculation() {
return discountCalculation;
}
public void setDiscountCalculation(DiscountCalculation discountCalculation) {
this.discountCalculation = discountCalculation;
}
/**
* 调用不同优惠策略逻辑方法
*/
public void calculation() {
discountCalculation.calculationDiscount();
}
}