您的位置:首页 > 编程语言 > Java开发

Java设计模式之策略模式

2019-05-29 16:57 141 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_39254815/article/details/90672265
  • 策略模式是对算法的包装,可以把代码中的算法和算法本身剥离开来,用不同的对象进行管理
  • 作用:

    可以用来解决多重if判断。

  •  

  • 环境(Context)角色:持有一个Strategy的引用。

    抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

    具体策略(ConcreteStrategy)角色:包装了相关的算法或行为

    抽象策略角色:

  • [code]
    /**
    * 策略模式-具体抽象角色
    */
    public interface PayStrategy {
    
    public String toPayHtml();
    }

    具体策略类:

  • [code]/**
    * 策略模式之具体策略
    */
    @Component
    public class AliPayStrategy implements PayStrategy {
    @Override
    public String toPayHtml() {
    return  "调用支付宝支付";
    }
    }
    [code]/**
    * 策略模式之具体策略
    */
    @Component
    public class MiPayStrategy implements PayStrategy {
    @Override
    public String toPayHtml() {
    return "小米支付接口";
    }
    }
    [code]
    /**
    * 策略模式之具体策略
    */
    @Component
    public class WxPayStrategy implements PayStrategy {
    @Override
    public String toPayHtml() {
    return  "调用微信支付";
    }
    }

    环境(context)角色:

  • [code]
    /**
    * 策略模式-环境(Context)角色
    * 通过枚举获取beanId
    * 再通过beanId从Spring容器中获取具体引用
    * 通过父类接收子类引用(向上转型)
    */
    public class StrategyContext {
    public static PayStrategy getPayStrategy(String strategyType){
    //通过枚举获取beanId
    String beanid = PayEnumStrategy.valueOf(strategyType).getBeanid();
    //再通过beanId从Spring容器中获取具体引用
    PayStrategy bean = (PayStrategy) SpringUtils.getBean(beanid);
    return bean;
    }
    
    }

    枚举类(维护beanId):

    [code]**
    * 策略模式-beanId配置枚举
    */
    public enum PayEnumStrategy {
    
    ALI_PAY("aliPayStrategy"),
    MI_PAY("miPayStrategy"),
    WX_PAY("wxPayStrategy"),
    
    ALI_PAY_LATE("aliPayCallbackTemplate"),
    UNION_PAY_LATE("unioPayCallbackTemplate");
    
    private String beanid;
    PayEnumStrategy(String beanid){
    this.setBeanid(beanid);
    }
    public String getBeanid() {
    return beanid;
    }
    
    public void setBeanid(String beanid) {
    this.beanid = beanid;
    }
    
    }

    测试:

  • [code]@RestController
    public class StratrgyController {
    
    @RequestMapping("/pay")
    //传入枚举
    public String pay(String payCode){
    PayStrategy payStrategy = StrategyContext.getPayStrategy(payCode);
    return  payStrategy.toPayHtml();
    }
    
    }

    beanId可以枚举维护,也可以通过数据库表维护

  • 总结:一个接口的多个实现,每个实现都是一个策略,环境角色通过传入的参数获取到具体的策略并实例化赋予父类接收。

  • 优点:

  •          提高了代码的拓展性(算法可以自由添加)

    算法可以自由切换

    缺点:

      如果算法过多,会导致策略类偏多,维护起了比较麻烦

      -------------------------------------------------------------------------本文内容参考蚂蚁课堂精讲设计模式系列

  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: