设计模式之策略模式

设计模式之策略模式


前言

提示:这里可以添加本文要记录的大概内容:

相信每个开发者的进阶之路都离不开设计模式 一起学习吧


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是策略模式

策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,相同的事情-----选择不用同方式 (不同实现)举例子,最终可以实现解决多重if判断问题。
1.环境(Context)角色:持有一个Strategy的引用。
2.抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现,此角色给出所有的具体策略类所需的接口。 接口或者抽象类定义 具体实现交给实现类或者是子类来做
3.具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
定义策略接口(抽象)->实现不同的策略类->利用多态或其他方式调用策略

二、策略模式应用场景

策略模式一般用于解决 if 冗余的问题 比如
支付场景 支付宝/微信支付/银联支付/平安支付等
联合登录 QQ联合登录/微信联合登录/钉钉联合登录

二、用策略模式优化聚合支付平台

##1.相信下面这段代码很多同学都写过 数量少还好 要是if 太多了就会很冗余 也不利于后期维护
代码如下(示例):

public  String toPayHtml2(String payCode){
    if("ali_pay".equals(payCode)){
        return  "调用支付宝接口...";
    }
    if("xiaomi_pay".equals(payCode)){
        return  "调用小米支付接口";
    }
    if("yinlian_pay".equals(payCode)){
        return  "调用银联支付接口...";
    }
    return  "未找到该接口...";
}


2.使用策略模式优化代码

代码如下(示例):因为基本的支付思想都是相同的,所以我们这里定义一个抽象类

public interface payStrategy {
    /**
     * 调用支付接口 基本支付思想都是相同的
     * @return
     */
    String toPayHtml();
}

3.子类继承抽象类方法

这里我们把不同的支付方法 全部写成子类

public class AliPayStrategy implements payStrategy {
    @Override
    public String toPayHtml() {
        return "对接支付宝接口";
    }
}
public class UnionPayStrategy implements payStrategy {
    @Override
    public String toPayHtml() {
        return "对接银联接口";
    }
public class WeChatPayStrategy implements payStrategy {
    @Override
    public String toPayHtml() {
        return "对接微信接口";
    }
}

4.由工厂方式进行实现

public class StrategyFactory {

    /**
     * 存放所有的PayStrategy key为PayStrategy别名 value是PayStrategy
     */
    private static Map<String, payStrategy> payStrategys = new HashMap<>();

    public StrategyFactory() {
        initStrategy();
    }

    public static void initStrategy() {
        payStrategys.put("aliPayStrategy", new AliPayStrategy());
        payStrategys.put("unionPayStrategy", new UnionPayStrategy());
        payStrategys.put("weChatPayStrategy", new WeChatPayStrategy());

    }


    public static payStrategy getPayStrategy(String strategyType) {
        return payStrategys.get(strategyType);
    }
}

4.测试

@RestController
public class PayContextService {
    private StrategyFactory strategyFactory = new StrategyFactory();

    @RequestMapping("/toPayHtml")
    public String toPayHtml(String payCode) {
        if (StringUtils.isEmpty(payCode)) {
            return "payCode is null";
        }
        //根据payCode名称从 StrategyFactory获取具体 Strategy策略
        payStrategy payStrategy = strategyFactory.getPayStrategy(payCode);
        if (payStrategy == null) {
            return "not found  payStrategy";
        }
        //获取到具体的payStrategy 调用toPayHtml
        return payStrategy.toPayHtml();
    }

}

可以看到前段调用什么方法 就会在工厂去找 对应的支付方法

总结

优点:策略模式最终帮助我们解决在实际开发中多重if判断问题、提高扩展性、维护性增强、提高代码可读性。
缺点:后期维护不同策略类是非常多、定义类比较多、代码量增大。
优点大于缺点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值