策略模式和委派模式在商品促销中的实际运用

最近有重新学习了策略模式和委派模式,自己也在之前商品促销中重新优化了代码,开始编写笔记。

委派模式,将某个功能交给其他类去做,该类只关心结果,可以看做是代理模式的静态模式。

策略模式,根据需求进行不同算法的运算,可以自由的切换,减少if else switch的使用,提高代码质量。

 

说起来还是有点抽象,来看看我在商品计算促销的实际运用,

首先需要一个计算商品促销的管理类,他把商品分好类,哪些参加促销,哪些不参加促销分好类,需要委派商品促销类进行促销计算,而商品有很多的促销,这样我们需要使用策略模式进行策略选择。这一套流程就开始进行程序设计了

商品促销管理类

/**
 * 这里其实应该采用单利模式,主要为了练习委托模式和策略模式
 */
public class ShoperSaleCaculate {

    /**
     * 传入list进行处理 这种只支持一种商品单种促销,多种促销在这基础上面修改即可
     */
    public static void beginPromotionDeal(List orderGoods){

        System.out.println("进行商品分类找到符合促销的和不支持促销的,支持促销进行分类");
        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 getPromotions(List allList){

        return null;
    }

}

策略工厂类,这个应该是比较核心的东西,运用了注册式单利,工厂模式,静态加载策略,这种写法比我之前那一套灵活了许多,代码也看起来简洁很多

/**
 * 创建一个促销策略工厂,根据促销类型进入不同的计算类中
 */
public class PromotionStrateFactory {

    //注册式单利
    private  static Map PROMOTION_STRATEGY_MAP = new HashMap();

    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";
    }


}

 

你可能感兴趣的:(java设计模式)