方式一
定义策略名称
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元");
}
}