最近有重新学习了策略模式和委派模式,自己也在之前商品促销中重新优化了代码,开始编写笔记。
委派模式,将某个功能交给其他类去做,该类只关心结果,可以看做是代理模式的静态模式。
策略模式,根据需求进行不同算法的运算,可以自由的切换,减少if else switch的使用,提高代码质量。
说起来还是有点抽象,来看看我在商品计算促销的实际运用,
首先需要一个计算商品促销的管理类,他把商品分好类,哪些参加促销,哪些不参加促销分好类,需要委派商品促销类进行促销计算,而商品有很多的促销,这样我们需要使用策略模式进行策略选择。这一套流程就开始进行程序设计了
商品促销管理类
/**
* 这里其实应该采用单利模式,主要为了练习委托模式和策略模式
*/
public class ShoperSaleCaculate {
/**
* 传入list进行处理 这种只支持一种商品单种促销,多种促销在这基础上面修改即可
*/
public static void beginPromotionDeal(List<OrderGoods> orderGoods){
System.out.println("进行商品分类找到符合促销的和不支持促销的,支持促销进行分类");
List<List> list = getPromotions(orderGoods);
List allMountList = new ArrayList();
for (int i = 0; i < list.size(); i++) {
List promotionList = list.get(i);
if (promotionList != null && promotionList.size() != 0){
//商品促销类型存放在单条商品列表中,便于找到
OrderGoods goods = (OrderGoods) promotionList.get(0);
//通过策略模式 由策略工厂进行处理加工
List resultList = PromotionStrateFactory.getGetPromotionStrategy(goods.getPromotion_type()).caculatePromotion(orderGoods);
allMountList.add(resultList);
}
}
//后面就是处理最终的结果
}
//进行商品分类找到符合促销的和不支持促销的,支持促销进行分类
public static List<List> getPromotions(List<OrderGoods> allList){
return null;
}
}
策略工厂类,这个应该是比较核心的东西,运用了注册式单利,工厂模式,静态加载策略,这种写法比我之前那一套灵活了许多,代码也看起来简洁很多
/**
* 创建一个促销策略工厂,根据促销类型进入不同的计算类中
*/
public class PromotionStrateFactory {
//注册式单利
private static Map<String,Promotion> PROMOTION_STRATEGY_MAP = new HashMap<String, Promotion>();
public PromotionStrateFactory() {
}
//类加载的时候就生成 方案
static {
PROMOTION_STRATEGY_MAP.put(PromotionKey.MIXSALE,new MixSale());
PROMOTION_STRATEGY_MAP.put(PromotionKey.PRESENTSALE,new PresentSale());
PROMOTION_STRATEGY_MAP.put(PromotionKey.TIMELIMITSALE,new TimeLimitSale());
PROMOTION_STRATEGY_MAP.put(PromotionKey.EMPTYPROMOTIONSALE,new EmptyPromotionSale());
}
public static Promotion emptyPromotionStrategy = new EmptyPromotionSale();
public static Promotion getGetPromotionStrategy(String key){
Promotion promotion = PROMOTION_STRATEGY_MAP.get(key);
return promotion==null?emptyPromotionStrategy:promotion;
}
public interface PromotionKey{
String MIXSALE = "MIXSALE";
String PRESENTSALE = "PRESENTSALE";
String TIMELIMITSALE = "TIMELIMITSALE";
String EMPTYPROMOTIONSALE = "EMPTYPROMOTIONSALE";
}
}