设计模式05--策略模式

1.策略模式

   定义:

   

   适用场景:

    

    优点:

    

    缺点:

    

   与策略模式相关的一些模式的区别:

   

    工厂模式接收指令,创建出符合要求的具体对象,而策略模式接受已经创建好的对象,从而实现不同的行为,因为他是行为模式,不属于创建模式。

   使用策略模式,客户端必须明确知道具体的状态,状态模式的话客户端是不需要知道具体的状态的。这些状态会自动转换。

策略模式的适用场景:当一个类具有多种状态的时候,并且在不同的状态下行为有差异的时候就可以适用策略模式,减少if-else的业务。

    2.类图

   比如在在双十一的活动中有三个促销策略,首先是返现策略,比如满两百返二十,然后是立减策略,然后是满减策略。

   然后双十一这个活动就可以看作是一个上下文对象,保存了不同的策略的抽象,他与这个策略是一个组合的关系,促销策略是整个双十一活动的一部分。

   

public interface PromotionStrategy {
    void doSomething();
}

public class FanXianStrategy implements PromotionStrategy {
    @Override
    public void doSomething() {
        System.out.println("购买返现30");
    }
}

public class LiJianStrategy implements PromotionStrategy {
    @Override
    public void doSomething() {
        System.out.println("购买立减20");
    }
}

public class ManJianStrategy implements PromotionStrategy {
    @Override
    public void doSomething() {
        System.out.println("满500减50");
    }
}

  

活动类持有策略:

public class PromotionActivity {
    private PromotionStrategy promotionStrategy;

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

    public void execute(){
        promotionStrategy.doSomething();
    }
}

 这样使用起来就很僵硬,因为后端要做大量的if else判断。

所以需要结合工厂和单例和策略来消除if else:

package com.wx.design_pattern.strategy;

import java.util.HashMap;
import java.util.Map;

/**
 * User: Mr.Wang
 * Date: 2019/12/7
 */
public class SrategyFactory {

    private SrategyFactory() {
    }

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

    static {
        PROMOTION_STRATEGY.put(PromotionStrategyKey.LI_JIAN, new LiJianStrategy());
        PROMOTION_STRATEGY.put(PromotionStrategyKey.MAN_JIAN, new ManJianStrategy());
        PROMOTION_STRATEGY.put(PromotionStrategyKey.FAN_XIAN, new FanXianStrategy());
    }

    public static PromotionStrategy getPromotionStrategy(String key) {
        return PROMOTION_STRATEGY.get(key) == null ? new EmptyStrategy() : PROMOTION_STRATEGY.get(key);
    }

    /**
     * 用接口起到一个分组作用,当然可以使用枚举,可以使用常量
     */
    private interface PromotionStrategyKey {
        String LI_JIAN = "lijian";
        String MAN_JIAN = "manjian";
        String FAN_XIAN = "fanxian";
    }
}

策略模式呢通常不是单独的使用,一般都要结合工厂啊,单例啊,享元模式来实现一段优雅的逻辑

3.策略模式的通用类图:

  这个策略和Context是聚合的关系

     

     

发布了217 篇原创文章 · 获赞 70 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_37650458/article/details/103434960