- 订单实体类
@Data
public class MyOrder {
private String source;
private String payMethod;
private String code;
}
- 订单处理接口
public interface OrderHandler {
void handle(MyOrder order);
}
- 订单处理不同实现类
@OrderHandlerType(source = "mobile",payMethod = "ali")
public class MobileAliOrderHandler implements OrderHandler{
@Override
public void handle(MyOrder order) {
System.out.println("处理移动端订单,阿里支付");
}
}
@OrderHandlerType(source = "mobile",payMethod = "wx")
public class MobileWXOrderHandler implements OrderHandler{
@Override
public void handle(MyOrder order) {
System.out.println("处理移动端订单,微信支付");
}
}
@OrderHandlerType(source = "pc",payMethod = "ali")
public class PCAliOrderHandler implements OrderHandler{
@Override
public void handle(MyOrder order) {
System.out.println("处理PC端订单,阿里支付");
}
}
@OrderHandlerType(source = "pc",payMethod = "wx")
public class PCWXOrderHandler implements OrderHandler{
@Override
public void handle(MyOrder order) {
System.out.println("处理PC端订单,微信支付");
}
}
- 自定义注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Service
public @interface OrderHandlerType {
String source();
String payMethod();
}
- 注解也是个接口,来一个实现类(一定要重写hashCode和equals方法)
public class OrderHandlerTypeImpl implements OrderHandlerType{
private String source;
private String payMethod;
OrderHandlerTypeImpl(String source, String payMethod) {
this.source = source;
this.payMethod = payMethod;
}
@Override
public String source() {
return source;
}
@Override
public String payMethod() {
return payMethod;
}
@Override
public Class<? extends Annotation> annotationType() {
return OrderHandlerType.class;
}
@Override
public int hashCode() {
int hashCode = 0;
hashCode += (127 * "source".hashCode()) ^ source.hashCode();
hashCode += (127 * "payMethod".hashCode()) ^ payMethod.hashCode();
return hashCode;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof OrderHandlerType)) {
return false;
}
OrderHandlerType other = (OrderHandlerType) obj;
return source.equals(other.source()) && payMethod.equals(other.payMethod());
}
}
- 接下来就是业务代码:Controller->Service->ServiceImpl,重点是ServiceImpl
@Service
public class OrderServiceImpl {
private Map<OrderHandlerType, OrderHandler> orderHandleMap;
@Autowired
public void setOrderHandleMap(List<OrderHandler> orderHandlers) {
orderHandleMap = orderHandlers.stream().collect(
Collectors.toMap(orderHandler -> AnnotationUtils.findAnnotation(orderHandler.getClass(), OrderHandlerType.class),
v -> v, (v1, v2) -> v1));
}
public void orderService(MyOrder order) {
OrderHandlerType orderHandlerType = new OrderHandlerTypeImpl(order.getSource(), order.getPayMethod());
OrderHandler orderHandler = orderHandleMap.get(orderHandlerType);
orderHandler.handle(order);
}
}
- 调用orderService()即可
参考文章