前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring项目中使用策略模式和工厂模式

Spring项目中使用策略模式和工厂模式

作者头像
sgr997
发布2022-11-10 14:01:25
4130
发布2022-11-10 14:01:25
举报
文章被收录于专栏:博客分享博客分享

不同类型的数据对应不同的处理的情况,自己经常以下边的方式处理,个人感觉扩展性也比较强,做个记录。

下边以多种支付类型做示例

假如当前系统支持微信支付和支付宝支付

示例

定义支付类型枚举,方便统一管理

代码语言:javascript
复制
public enum PayEnum {

    /**
     * 微信支付
     */
    WX(1, "wx"),

    /**
     * 支付宝支付
     */
    ALIPAY(2, "alipay");

    private final int code;
    private final String en;

    PayEnum(int code, String en) {
        this.code = code;
        this.en = en;
    }

    public int getCode() {
        return code;
    }

    public String getEn() {
        return en;
    }

    /**
     * 方便通过code来获取枚举类型
     *
     * @param code
     * @return
     */
    public static PayEnum getByCode(int code) {
        for (PayEnum value : values()) {
            if (value.getCode() == code) {
                return value;
            }
        }
        return null;
    }
}

定义一个支付处理类PayService

代码语言:javascript
复制
/**
 * PayService
 *
 * @author ZXP
 * @date 2021/12/4 21:23
 */
public interface PayService {

    /**
     * 支持的支付类型
     *
     * @return
     */
    PayEnum getPayType();

    /**
     * 具体的支付逻辑
     *
     * @param obj
     */
    void pay(Object obj);
}

两个实现类WxPayServiceImplAliPayServiceImpl,分别对应处理微信支付和支付宝支付,别忘了加**@Service**注解(@Component也一样)

代码语言:javascript
复制
/**
 * 微信支付处理类
 *
 * @author ZXP
 * @date 2021/12/4 21:28
 */
@Service
public class WxPayServiceImpl implements PayService {

    @Override
    public PayEnum getPayType() {
        return PayEnum.WX;
    }

    @Override
    public void pay(Object obj) {
        // wx支付逻辑
        System.out.println("使用了微信支付");
    }
}

/**
 * 支付宝支付处理类
 *
 * @author ZXP
 * @date 2021/12/4 21:29
 */
@Service
public class AliPayServiceImpl implements PayService {

    @Override
    public PayEnum getPayType() {
        return PayEnum.ALIPAY;
    }

    @Override
    public void pay(Object obj) {
        // 支付宝支付的逻辑
        System.out.println("使用了支付宝支付");
    }
}

定义支付处理类工厂PayServiceFactory,管理所有PayService的实现类,该类实现了Spring提供的ApplicationContextAware接口,重写setApplicationContext(ApplicationContext applicationContext)方法,可以通过ApplicationContext获取所有PayService的实现类,然后注册到Map中

代码语言:javascript
复制
/**
 * PayServiceFactory
 *
 * @author ZXP
 * @date 2021/12/4 21:31
 */
@Component
public final class PayServiceFactory implements ApplicationContextAware {

    private static final Map<PayEnum, PayService> SERVICES = new ConcurrentHashMap<>(16);

    /**
     * 通过支付类型获取具体的支付处理类
     *
     * @param payEnum
     * @return
     */
    public static PayService get(PayEnum payEnum) {
        return SERVICES.get(payEnum);
    }

    /**
     * 通过code获取支付处理类
     *
     * @param code
     * @return
     */
    public static PayService get(int code) {
        return get(PayEnum.getByCode(code));
    }

    /**
     * 注册PayService
     *
     * @param payService
     * @return
     */
    public static void register(PayService payService) {
        SERVICES.put(payService.getPayType(), payService);
    }

    /**
     * 初始化方法
     *
     * @param applicationContext
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // 从容器中获取全部的支付处理类,注册到
        Map<String, PayService> payServices = applicationContext.getBeansOfType(PayService.class);
        for (PayService payService : payServices.values()) {
            // 注册到map中
            register(payService);
        }
    }
}

使用演示

代码语言:javascript
复制
@Test
public void testPay() {
    // 微信支付
    PayServiceFactory.get(PayEnum.WX).pay(new Object());
    // 支付宝支付
    PayServiceFactory.get(PayEnum.ALIPAY).pay(new Object());
}

运行结果:

总结

上述使用策略模式将不同支付类型的处理逻辑分发到不同的支付处理类中处理,可读性也较强,之后如果要增加新的支付方式,只需要添加一种枚举类型,新增加一个PayService的实现类即可,PayServiceFactory会自动将所有实现类注册到自己内部的Map中,从而使用时只需要通过支付类型到PayServiceFactory中获取支付处理类即可。

扩展

如若某些类型处理逻辑大致相同,只有某些小步骤不相同,此时可以引入模板方法模式加以处理,大致逻辑时在PayService和实现类之间增加一个抽象类,抽象类中重写相同的方法,某些特定步骤则下沉到具体实现类中处理。

扩展实现如下:Spring中使用模板方法模式

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 示例
  • 使用演示
  • 总结
  • 扩展
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档