package com.credi.util.handler;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class Order {
private String source;
private String payMethod;
private String code;
private BigDecimal amount;
}
package com.credi.util.handler2;
import com.credi.util.handler.Order;
public interface OrderHandler {
void handle(Order order);
}
package com.credi.util.handler3;
import com.credi.util.handler2.OrderHandlerType;
import java.lang.annotation.Annotation;
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());
}
}
package com.credi.util.handler2;
import org.springframework.stereotype.Service;
import java.lang.annotation.*;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Service
public @interface OrderHandlerType {
String source();
String payMethod();
}
package com.credi.util.handler2;
ackage com.credi.util.handler2;
import com.credi.util.handler.Order;
@OrderHandlerType(source = "pc",payMethod = "支付宝")
public class PCOrderHandler implements OrderHandler {
@Override
public void handle(Order order) {
System.out.println("处理PC端订单" + ", 支付方式支付宝");
}
}
package com.credi.util.handler3;
import com.credi.util.handler.Order;
import com.credi.util.handler2.MobileOrderHandler;
import com.credi.util.handler2.OrderHandler;
import com.credi.util.handler2.OrderHandlerType;
import com.credi.util.handler2.PCOrderHandler;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Service
public class OrderService2 {
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(Order order) {
OrderHandlerType orderHandlerType = new OrderHandlerTypeImpl(order.getSource(), order.getPayMethod());
OrderHandler orderHandler = orderHandleMap.get(orderHandlerType);
orderHandler.handle(order);
}
public static void main(String[] args) {
MobileOrderHandler mobileOrderHandler = new MobileOrderHandler();
PCOrderHandler pcOrderHandler = new PCOrderHandler();
List<OrderHandler> list = new ArrayList<>();
list.add(mobileOrderHandler);
list.add(pcOrderHandler);
OrderService2 orderService = new OrderService2();
orderService.setOrderHandleMap(list);
Order order = new Order();
order.setSource("mobile");
order.setPayMethod("微信");
order.setAmount(new BigDecimal("11"));
orderService.orderService(order);
}
@Data
@Accessors(chain = true)
static class UserBo{
private int UserId;
private String UserName;
}
}