策略模式

定义

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

类型

行为型

适用场景

  • 系统有很多类,而他们的区别仅仅在于他们的行为不同
  • 一个系统需要动态地在几种算法中选择一种

优点

  • 开闭原则
  • 避免使用多重条件转移语句
  • 提高算法的保密性和安全性

缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
  • 产生很多策略类

Coding

假如这样一个场景,课程有促销活动,促销策略有满减、立减、返现等

// 促销策略基类
public interface PromotionStrategy {
    void doPromotion();
}
// 满减
public class ManJianPromotionStrategy implements PromotionStrategy {
    public void doPromotion() {
        System.out.println("满减促销,满200-20");
    }
}
// 立减
public class LiJianPromotionStrategy implements PromotionStrategy {
    public void doPromotion() {
        System.out.println("立减促销,课程的价格直接减去配置的价格");
    }
}
// 返现
public class FanXianPromotionStrategy implements PromotionStrategy {
    public void doPromotion() {
        System.out.println("返现促销,返回的金额存放到用户余额中");
    }
}
// 促销活动类
public class PromotionActivity {
    private PromotionStrategy promotionStrategy;
    public PromotionActivity(PromotionStrategy promotionStrategy) {
        this.promotionStrategy = promotionStrategy;
    }
    public void executePromotionStrategy(){
        promotionStrategy.doPromotion();
    }
}

看下客户端调用:

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

        promotionActivity618.executePromotionStrategy();
        promotionActivity1111.executePromotionStrategy();
    }
}
// console
// 满减促销,满200-20
// 返现促销,返回的金额存放到用户余额中

如果不是用策略模式的话,平时是把所有策略的具体实现放到 PromotionActivity 的 executePromotionStrategy 方法里,通过if else 区分,形成一个较大的方法。

改进

现在的这种写法还是无法消除完if else语句,因为我们真实环境客户端调用时,可能要写成这样:

public class Test {
    public static void main(String[] args) {
        // 入参
        String promotionKey = "LIJIAN";
        PromotionActivity promotionActivity = null;
        if ("LIJIAN".equals(promotionKey)){
            promotionActivity = new PromotionActivity(new LiJianPromotionStrategy());
        } else if ("MANJIAN".equals(promotionKey)){
            promotionActivity = new PromotionActivity(new ManJianPromotionStrategy());
        } // ...
        promotionActivity.executePromotionStrategy();
    }
}

每次都需要根据情况new一个策略和活动。

结合工厂改进

// 工厂类
public class PromotionStrategyFactory {
    private PromotionStrategyFactory(){}
    private static Map<String, PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<>();
    static {
        PROMOTION_STRATEGY_MAP.put(PromotionKey.MANJIAN, new ManJianPromotionStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionKey.LIJIAN, new LiJianPromotionStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionKey.FANXIAN, new FanXianPromotionStrategy());
    }
    private static final PromotionStrategy NON_PROMOTION = new EmptyPromotionStrategy();

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

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

public class EmptyPromotionStrategy implements PromotionStrategy {
    public void doPromotion() {
        System.out.println("啥都不做");
    }
}

现在的客户端调用:

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

如果帮到你了,请点击右上角给个赞吧!!

学习笔记。内容总结于Geely老师的《Java设计模式精讲 》

欢迎访问我的博客: 他和她的猫

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值