在实际开发过程中经常会出现行为不同得实现,比如支付,那可能是支付,阿里支付,银联等支付得具体实现。要你用一个设计模式来实现
定义策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法得变化不会影响到使用算法得客户
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等AllArgsConstructorpublic 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等Slf4jpublic 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等Slf4jpublic 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;等RestControllerpublic class PayController { 等GetMapping("pay/{type}") public boolean pay(等PathVariable("type") String type){ StrategyFactory.getService(type); return true; }}
测试结果
测试支付:localhost:10001/pay/wx
测试阿里支付:localhost:10001/pay/zfb