策略模式介绍以及具体使用场景

开发 前端
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。

前言

在实际开发过程中经常会出现行为不同的实现,比如支付,那可能是微信支付,阿里支付,银联等支付的具体实现。要你用一个设计模式来实现

定义

策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户

UML类图

具体实现

InitializingBean接口说明

1、InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。

2、spring初始化bean的时候,如果bean实现了InitializingBean接口,会自动调用afterPropertiesSet方法。

3、在Spring初始化bean的时候,如果该bean实现了InitializingBean接口,并且同时在配置文件中指定了init-method,系统则是先调用afterPropertieSet()方法,然后再调用init-method中指定的方法。

策略工厂

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class StrategyFactory {

private static final Map<String, PayService> serviceMap = new ConcurrentHashMap<>();

public static void register(PayTypeEnum payTypeEnum, PayService service){
serviceMap.put(payTypeEnum.getType(), service);
}

public static Boolean getService(String payType){
PayService payService = serviceMap.get(payType);
if(payService!=null){
return payService.pay(payType);
}
return Boolean.FALSE;
}
}

支付枚举

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum PayTypeEnum {
WX("wx", "微信"),
ZFB("zfb","支付宝支付"),;
private String type;
private String desc;
}

具体业务类

1、支付入口

public interface PayService {
Boolean pay(String payType);
}

2、支付入口具体实现

微信支付逻辑

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class WxPayService implements PayService, InitializingBean {

@Override
public void afterPropertiesSet() throws Exception {
StrategyFactory.register(PayTypeEnum.WX,this);
}

@Override
public Boolean pay(String payType){
log.info("调用微信支付");
return true;
}
}

阿里支付具体逻辑

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;


import org.springframework.stereotype.Service;

@Service
@Slf4j
public class AliPayService implements PayService, InitializingBean {
@Override
public void afterPropertiesSet(){
StrategyFactory.register(PayTypeEnum.ZFB, this);
}
@Override
public Boolean pay(String payType){
log.info("调用阿里支付");
return true;
}
}

3、定义一个控制器测试

import com.example.demo.celuemoshi.StrategyFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PayController {

@GetMapping("pay/{type}")
public boolean pay(@PathVariable("type") String type){
StrategyFactory.getService(type);
return true;
}
}

测试结果

测试微信支付:http://localhost:10001/pay/wx

测试阿里支付:http://localhost:10001/pay/zfb

责任编辑:武晓燕 来源: 今日头条
相关推荐

2020-04-07 14:20:10

RabbitMMySQL数据库

2023-03-20 09:17:13

策略模式Springboot

2023-02-22 09:16:22

2021-08-29 22:05:04

对象自动回收

2023-06-06 08:18:24

Kafka架构应用场景

2015-06-26 11:33:23

Python装饰器使用场景实践

2021-11-04 06:58:32

策略模式面试

2020-10-29 07:16:26

布隆过滤器场景

2014-05-15 09:43:11

CloudaMobile WebANodejs

2023-05-16 07:47:18

RabbitMQ消息队列系统

2021-04-27 08:31:10

前端应用场景

2018-08-15 09:48:27

数据库Redis应用场景

2021-08-06 10:43:56

Kubernetes容器

2020-06-16 15:40:32

闭锁栅栏线程

2009-09-24 16:55:27

策略模式

2023-10-29 15:21:42

负载均衡器分布式系统后端

2022-10-12 07:24:18

大文件哈希算法Hash

2024-05-11 12:47:16

Kafka场景.高性能

2013-12-25 16:03:39

GitGit 命令

2021-08-13 12:31:26

Redis代码Java
点赞
收藏

51CTO技术栈公众号