关于设计模式:设计模式策略模式

39次阅读

共计 2069 个字符,预计需要花费 6 分钟才能阅读完成。

策略模式

1. 定义与类型

  • 定义:定义了算法家族,别离封装起来,让他们之间能够相互转换,此模式让算法的变动不会影响到应用算法的用户
  • if…else
  • 类型: 行为型

2. 实用场景

  • 零碎有很多类,而他们的区别仅仅在于他们的行为不同
  • 一个零碎须要动静地在几种算法中抉择一种

3. 长处

  • 开闭准则
  • 防止应用多种条件转移语句
  • 进步算法的保密性和安全性

4. 毛病

  • 客户端必须晓得所有的策略类,并自行决定应用哪一个策略类
  • 产生很多策略类

5. 相干设计模式

  • 策略模式 和 工厂模式
  • 策略模式 和 状态模式

6.Coding

​ 策略模式加工厂模式

  • 创立策略接口 Promotion
public interface PromotionStrategy {void doPromotion();
}
  • 创立一系列促销策略
public class FanXianPromotionStrategy implements PromotionStrategy{
    @Override
    public void doPromotion() {System.out.println("返现促销, 返回的余额寄存到用户余额中!");
    }
}
public class LiJianPromotionStrategy implements PromotionStrategy {
    @Override
    public void doPromotion() {System.out.println("立减促销, 课程的价格间接减去配置的价格");
    }
}
public class ManJianPromotionStrategy implements PromotionStrategy{
    @Override
    public void doPromotion() {System.out.println("满减促销:满 200 减 20");
    }
}
  • 创立促销流动:用来执行促销策略的类
public class PromotionActivity {
  
    private PromotionStrategy strategy;
  
    public PromotionActivity(PromotionStrategy strategy){this.strategy = strategy;}

    public void executeStrategy(){strategy.doPromotion();
    }
}
  • 创立促销策略工厂
/**
 * @program: design_pattern
 * @description: 促销策略工厂
 * @create: 2021-10-13 22:23
 **/
public class PromotionStrategyFactory {

    /** 私有化结构器  */
    private PromotionStrategyFactory(){}

    private static  final Map<String,PromotionStrategy>  PROMOTION_STRATEGY_MAP = new HashMap<>();

    // 初始化工厂
    static {PROMOTION_STRATEGY_MAP.put(PromotionType.FANXIAN,new FanXianPromotionStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionType.LIJIAN,new LiJianPromotionStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionType.MANJIAN,new ManJianPromotionStrategy());
    }

    /** 对外提供获取策略的办法 */
    public  static PromotionStrategy getPromotionStrategy(String promotionKey){PromotionStrategy promotionStrategy = PROMOTION_STRATEGY_MAP.get(promotionKey);
        return promotionStrategy == null?null:promotionStrategy;
    }

    private interface PromotionType{
         String LIJIAN = "LIJIAN";
         String MANJIAN = "MANJIAN";
         String FANXIAN = "FANXIAN";
    }

}
  • 测试类
public class Test {public static void main(String[] args) {
        String promotionKey = "LIJIAN";
        PromotionActivity promotionActivity = 
          new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey));
        promotionActivity.executeStrategy();}
}
  • 控制台输入:

7. 总结

  • 策略模式联合工厂模式缩小了 if…else 代码,进步了代码的效率和可维护性
  • 代码的解耦
  • 策略类中都有独特的行为,不过这个行为的后果不一样

正文完
 0