策略模式的实现

方式一

定义策略名称

public class MsgTypeConstant {

    public static final String chat_msg = "chatMsg";
    public static final String sys_msg = "sysMsg";
}

定义策略名称注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Type {
    String value();
}

定义策略行为接口

public interface BaseMsgHandler {
    void handleMsg(String content);
}

定义策略处理器

@Component
@Type(value = MsgType.CHAT_MSG)
public class ChatMsgHandler implements BaseMsgHandler{

    @Override
    public void handleMsg(String msg) {
        System.out.println("This is chatMsg. Detail msg information is :" + msg);
    }
}
@Component
@Type(value = MsgType.SYS_MSG)
public class SysMsgHandler implements BaseMsgHandler{

    @Override
    public void handleMsg(String msg) {
        System.out.println("This is sysMsg. Detail msg information is :" + msg);
    }
}

初始化策略

@Component
public class MsgConfig implements ApplicationContextAware {

    public static final Map<String, BaseMsgHandler> msgStrategyMap = new HashMap<>();

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        applicationContext.getBeansWithAnnotation(Type.class).entrySet().iterator().forEachRemaining(entrySet ->{

            msgStrategyMap.put(entrySet.getValue().getClass().getAnnotation(Type.class).value(),
                    (BaseMsgHandler) entrySet.getValue());
        });
    }
}

定义实体类 接口

@Data
public class Msg{
    private String content;
    private MsgTypeConstant msgType;
}
	@ApiOperation(value="msg")
	@RequestMapping("msg")
	public void handleMsg(@RequestParam(name="content") String content, @RequestParam(name="msgType") String msgType){
		BaseMsgHandler handler = MsgConfig.msgStrategyMap.get(msgType);
		handler.handleMsg(content);
	}

方式二

private OrderService orderService;

@PostMapping("/makeOrder")
// 商品id
// 支付类型
public ResultData makeOrder(Long goodsId,String type){
    // 生成本地的订单
    Order order = this.orderService.makeOrder(goodsId);
    //选择支付方式
    PayType payType = PayType.getByCode(type);
    //进行支付
    payType.get().pay(order.getId(),order.getAmount());
    return this.ok();
}
public enum PayType {
    //支付宝        AliPay 是实现类
    ALI_PAY("1",new AliPay()),
    //微信
    WECHAT_PAY("2",new WechatPay());

    private String payType;
    // 这是一个接口
    private Payment payment;
    PayType(String payType,Payment payment){
        this.payment = payment;
        this.payType = payType;
    }
    //通过get方法获取支付方式
    public Payment get(){ return  this.payment;}
    
    public static PayType getByCode(String payType) {
        for (PayType e : PayType.values()) {
            if (e.payType.equals(payType)) {
                return e;
            }
        }
        return null;
    }
}
public interface Payment {
    public void pay(Long order, double amount);
}
public class AliPay implements Payment {
    @Override
    public void pay(Long order, double amount) {
        System.out.println("----支付宝支付----");
        System.out.println("支付宝支付111元");
    }
}
public class WechatPay implements Payment {
    @Override
    public void pay(Long orderId, double amount) {
        System.out.println("---微信支付---");
        System.out.println("支付222元");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35956444/article/details/115304441