美文网首页Java服务器端编程
设计模式-策略模式(Strategy Pattern)

设计模式-策略模式(Strategy Pattern)

作者: 迦叶_金色的人生_荣耀而又辉煌 | 来源:发表于2020-11-14 07:49 被阅读0次

    上一篇 <<<责任链模式(Chain of Responsibility Pattern)
    下一篇 >>>模板方法模式(Template Pattern)


    策略模式:定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

    策略模式在Spring的使用场景

    把多重if判断分割成多个不同的对象管理

    • ApplicationContext

    FileSystemXmlApplicationContext
    ClassPathXmlApplicationContext
    XmlWebApplicationContext
    ……

    • Resource

    UrlResource:访问网络资源的实现类。
    ClassPathResource:访问类加载路径里资源的实现类。
    FileSystemResource:访问文件系统里资源的实现类。
    ServletContextResource:访问相对于 ServletContext 路径里的资源的实现类:
    InputStreamResource:访问输入流资源的实现类。
    ByteArrayResource:访问字节数组资源的实现类。

    • 初始化策略:
      SimpleInstantiationStrategy 简单初始化策略
      CglibSubclassingInstantiationStrategy CGLIB初始化策略

    策略模式优缺点

    优点:
    1、避免对原有多重if条件的源码修改;
    2、策略算法可以自由切换;
    3、扩展性好

    缺点:
    1、所有的策略都需要暴露给外面;
    2、需要配合工厂模式或代理模式;
    3、代码量增加

    策略模式与状态模式的区别

    a、状态模式不同状态下做的事情不同,而策略模式做的都是同一件事。
    状态模式重点在各状态之间的切换从而做不同的事情,而策略模式更侧重于根据具体情况选择策略,并不涉及切换。
    b、状态模式封装了对象的状态,而策略模式封装算法或策略。
    c、在状态模式中,每个状态通过持有Context的引用,来实现状态转移;但是每个策略都不持有Context的引用,它们只是被Context使用。

    策略模式实现方式核心代码

    public interface PayStrategy {
        /**
         * 共同算法实现骨架
         * @return
         */
         public String toPayHtml();
    }
    
    @Component
    public class AliPayStrategy  implements PayStrategy {
        @Override
        public String toPayHtml() {
            return "调用支付宝支付接口";
        }
    }
    

    1)、枚举+反射

    public enum PayEnumStrategy {
    
        /**
         *  支付宝支付【也可以配置容器中的ID】
         */
        ALI_PAY("com.jarye.strategy.impl.AliPayStrategy"),
        /**
         *  银联支付【也可以配置容器中的ID】
         */
        UNION_PAY("com.jarye.strategy.impl.UnionPayStrategy");
        PayEnumStrategy(String className) {
            this.setClassName(className);
        }
    
        public String getClassName() {
            return className;
        }
    
        public void setClassName(String className) {
            this.className = className;
        }
    
        /**
         * class完整地址
         */
        private String className;
    
    }
    
    public static PayStrategy getPayStrategy(String strategyType) {
        try {
            // 1.获取枚举中className
            String className = PayEnumStrategy.valueOf(strategyType).getClassName();
            // 2.使用java反射技术初始化类【也可以根据容器中的ID获取bean】
            return (PayStrategy) Class.forName(className).newInstance();
        } catch (Exception e) {
            return null;
        }
    }
    

    2)、数据库配置

    // 1.使用PayCode查询
    PaymentChannelEntity paymentChannel = paymentChannelMapper.getPaymentChannel(payCode);
    if(paymentChannel==null){
        return  "该渠道为空...";
    }
    // 2.获取策略执行的beanid
    String strategyBeanId = paymentChannel.getStrategyBeanId();
    // 3.使用strategyBeanId获取对应spring容器bean信息
    PayStrategy payStrategy = springUtils.getBean(strategyBeanId, PayStrategy.class);
    

    相关文章链接:
    <<<23种常用设计模式总览
    <<<代理模式(Proxy Pattern)
    <<<装饰模式(Decorator Pattern)
    <<<观察者模式(Observer Pattern)
    <<<单例模式(Singleton Pattern)
    <<<责任链模式(Chain of Responsibility Pattern)
    <<<模板方法模式(Template Pattern)
    <<<外观/门面模式(Facade Pattern)
    <<<建造者模式(Builder Pattern)
    <<<适配器模式(Adapter Pattern)
    <<<原型模式(Prototype Pattern)
    <<<工厂相关模式(Factory Pattern)

    相关文章

      网友评论

        本文标题:设计模式-策略模式(Strategy Pattern)

        本文链接:https://www.haomeiwen.com/subject/qmnbbktx.html