work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

策略模式

Posted on 2019-02-27 12:26  work hard work smart  阅读(191)  评论(0编辑  收藏  举报

一、定义:

定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户

方法中有大量的if...else...

类型:行为型

 

二、适用场景

系统有很多类,而他们的区别仅仅在于他们的行为的不同

一个系统需要动态地在几种算法(策略)中选择一种

 

三、优点

1、开闭原则

2、避免使用多种条件转移语句if..else

3、提高算法的保密性和安全性

 

四、缺点

1、客户端必须知道所有的策略类,并自行决定使用哪一种策略类

2、产生很大策略类

 

五、策略模式-相关设计模式

1、策略模式和工厂模式(工厂方法、抽象工厂)

工厂模式:创建型设计模式。接受指令,创建符合要求的对象

策略模式:行为型设计模式。接受已经创建好的对象,从而实现不同的行为。

 

2、策略模式和状态模式

策略模式:客户端需要知道选择哪个策略

状态模式:客户端不需要关系具体的状态,这些状态可以自动转换。

 

六、Conding

课程促销行为,促销策略:满减策略,发现促销策略

1、PromotionStrategy 接口

/**
 *  促销策略
 */
public interface PromotionStrategy {
    void doPromotion();
}

  

2、FanXianPromotionStrategy 类

/**
 * 反现策略
 */
public class FanXianPromotionStrategy  implements  PromotionStrategy{
    @Override
    public void doPromotion() {
        System.out.println("反现促销,返回的金额放到余额中。");
    }
}

  

3、LiJianPromotionStrategy类

/**
 * 立减策略
 */
public class LiJianPromotionStrategy implements  PromotionStrategy{
    @Override
    public void doPromotion() {
        System.out.println("立减促销,课程的价格返回配置的价格");
    }
}

  

4、ManJianPromotionStrategy  类

/**
 * 满减策略
 */
public class ManJianPromotionStrategy  implements  PromotionStrategy{
    @Override
    public void doPromotion() {
        System.out.println("满减促销,满200元,减20元");
    }
}

  

5、PromotionActivity 类

/**
 * 促销活动
 */
public class PromotionActivity {

    private  PromotionStrategy promotionStrategy;

    public PromotionActivity(PromotionStrategy promotionStrategy) {
        this.promotionStrategy = promotionStrategy;
    }

    public void execute(){
        this.promotionStrategy.doPromotion();
    }
}

 

6、测试

 

public class Test {
    public static void main(String[] args) {
        PromotionActivity promotionActivity618 = new PromotionActivity(new LiJianPromotionStrategy()) ;

        PromotionActivity promotionActivity1111 = new PromotionActivity(new FanXianPromotionStrategy()) ;
        promotionActivity618.execute();
        promotionActivity1111.execute();
    }
}

  

7、UML图

 

七、Coding演进

上面的方法缺点:还是不能去除if...else...

升级:

1、PromotionStrategyFactory 类

/**
 * 促销策略工厂
 */
public class PromotionStrategyFactory {
    private static Map<String, PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<>();

    static {
        PROMOTION_STRATEGY_MAP.put(PromationKey.LIJIAN, new LiJianPromotionStrategy());
        PROMOTION_STRATEGY_MAP.put(PromationKey.FANXIAN, new FanXianPromotionStrategy());
        PROMOTION_STRATEGY_MAP.put(PromationKey.MANJIAN, new ManJianPromotionStrategy());
    }

    private  static  final PromotionStrategy NONE_PROMATION = new EmptyPromotionStrategy();

    private PromotionStrategyFactory(){

    }

    public static PromotionStrategy getPromotionStrategy(String promotionKey){
        PromotionStrategy promotionStrategy = PROMOTION_STRATEGY_MAP.get(promotionKey);
        return  promotionStrategy == null ? NONE_PROMATION : promotionStrategy;
    }

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

  

2、EmptyPromotionStrategy 类

public class EmptyPromotionStrategy implements  PromotionStrategy{
    @Override
    public void doPromotion() {
        System.out.println("无促销活动");
    }
}

  

3、测试

    public static void main(String[] args) {
        String promotionKey = "LIJIAN";
        PromotionActivity promotionActivity = new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey));
        promotionActivity.execute();


    }

  这样就消除了If..Else

 

 

八、在源码中的使用

1、Comparator

 如BooleanComparator,BigDecimalComparator实现了比较器。就好比有多重策略。

 

2、Spring 中的Resource(策略的抽象)

 

实现类ClassPathResource(策略的实现)

 

3、Spring中的初始化策略类

实现类有: