zoukankan      html  css  js  c++  java
  • 策略模式(Strategy 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)
    <<<策略模式(Strategy Pattern)
    <<<模板方法模式(Template Pattern)
    <<<外观/门面模式(Facade Pattern)
    <<<建造者模式(Builder Pattern)
    <<<适配器模式(Adapter Pattern)
    <<<原型模式(Prototype Pattern)
    <<<工厂相关模式(Factory Pattern)

  • 相关阅读:
    仿12306客户端
    object-c开发中混合使用或不使用ARC
    Objective-c 的 @property 详解
    iPhone的Push(推送通知)功能原理浅析
    Objective-C内存管理教程和原理剖析3
    IDEA 创建JAVA Maven Web 工程
    Linux CenOS 7 安装Redis
    Linux CenOS 7 安装Tomcat
    Linux CentOS 7 安装wordpress
    Linux CenOS 7 安装JDK
  • 原文地址:https://www.cnblogs.com/jarye/p/14057457.html
Copyright © 2011-2022 走看看