设计模式之-策略模式(应用很广)

策略模式解决的核心:代码的重构以及优化:if-else

设计原则:开闭原则

设计核心:策略的上下文,用于动态的获取具体的某个策略对象

设计的相关类:策略的抽象类,策略的具体实现类,策略上下文类以及动态的获取策略对象类

动态获取对象:反射(也可以结合Spring的上下文管理)

核心问题:根据策略标识(就是if-else中的相关条件)获取策略对象,然后根据策略上下文执行具体的相关策略

下面是具体的业务场景

package com.knowledge.strategy;

/**
 * 1.也可以通过Spring的上下文管理进行获取
 * 2.通过反射进行获取
 * 3.模板模式,以及策略模式
 */
public class PayStrategyUtils {
    public static IPayStrategy getPayStrategy(String payType) {
        //想到实际业务场景中,代码的调用流程,以至于用于生产环境
        //这一段数据应该是来源于数据库.
        // 这个路径需要根据你来定义,属于一种规则,这样一来,将所有策略都写在该包下即可
        try {
            String path = "com.knowledge.strategy." + payType.concat("PayStrategy");
            Class clazz = Class.forName(path);
            IPayStrategy instance = (IPayStrategy) clazz.getDeclaredMethod("getInstance").invoke(null, null);
            return instance;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("Load [" + payType.concat("Strategy") + "] Error :", e);
        }
    }
}
package com.knowledge.strategy;

public class WexinPayStrategy implements IPayStrategy {
    private static WexinPayStrategy wexinPayStrategy;

    //单例的基本特点:私有化构造,提供获取单例的静态方法
    private WexinPayStrategy() {
    }

    //给外界提供单例
    public static WexinPayStrategy getInstance() {
        if (null == wexinPayStrategy) {
            wexinPayStrategy = new WexinPayStrategy();
        }
        return wexinPayStrategy;
    }

    @Override
    public void pay() {
        System.out.println("微信支付.");
    }
}
package com.knowledge.strategy;

/**
 * 动态的获取---》多态的应用
 */
public class PayStrategyContext {

    private IPayStrategy iPayStrategy;

    public PayStrategyContext() {

    }

    /**
     * 明白生产环境和测试环境代码的灵活性
     */
    public void executePay() {
        if (iPayStrategy == null) {
            throw new RuntimeException("支付策略未配置");
        }
        iPayStrategy.pay();

    }

    public void setiPayStrategy(IPayStrategy iPayStrategy) {
        this.iPayStrategy = iPayStrategy;
    }

    public IPayStrategy getiPayStrategy() {
        return iPayStrategy;
    }

}
package com.knowledge.strategy;

public class EBankPayStrategy implements IPayStrategy{
    @Override
    public void pay() {
        System.out.println("银联支付.");
    }
}
package com.knowledge.strategy;

public class AliPayStrategy implements IPayStrategy{
    @Override
    public void pay() {
        System.out.println("支付宝支付.");
    }
}

参考这篇博客写的不错: https://www.toutiao.com/i6833919076016849411/

 

你可能感兴趣的:(设计模式之-策略模式(应用很广))