首先有四要素:1每种策略都要执行的接口及对应实体类 2接口实现类(各个策略具体实现)3策略Map封装,根据key在Map里找到对应的策略应对
举例:根据不同的支付订单产生不同的应对策略
4种策略: (1)PC端支付宝支付 (2)PC端微信支付 (3)手机端支付宝支付(4)手机端微信支付
1每种策略都要执行的接口及对应实体类
@Data
@Component
public class Order implements Serializable {
/**
* 订单来源
*/
private String source;
/**
* 支付方式
*/
private String payMethod;
/**
* 订单编号
*/
private String code;
/**
* 订单金额
*/
private BigDecimal amount;
/**其他字段 */
}
/**
* @author czh
* @discription 每个订单处理类都需要实现的接口
*/
public interface OrderHandler {
/**
*
* 处理订单的方法
* @param order 订单石头类
* @return 返回信息
*/
void handle(Order order);
}
/**
* @author czh
* @discription 作用于类上,用来标注某个类是用来处理哪种来源的订单
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Service
public @interface OrderHandlerType {
String source();
String payMethod();
}
2接口实现类
/**
* @author czh
* @discription pc端支付宝支付
*/
@OrderHandlerType(source = "pc", payMethod = "ali")
@Slf4j
public class PcAliPayOrderHandler implements OrderHandler {
@Override
public void handle(Order order) {
log.info("处理pc端支付宝支付的订单");
}
}
/**
* @author czh
* @discription pc端微信支付
*/
@OrderHandlerType(source = "pc", payMethod = "wechat")
@Slf4j
public class PcWeChatOrderHandler implements OrderHandler {
@Override
public void handle(Order order)
{
log.info("处理pc端微信支付的订单");
}
}
/**
* @author czh
* @discription 手机端支付宝支付
*/
@OrderHandlerType(source = "mobile",payMethod = "ali")
@Slf4j
public class MobileALiPayOrderHandler implements OrderHandler {
@Override
public void handle(Order order) {
log.info("处理手机端支付宝支付的订单");
}
}
/**
* @author czh
* @discription 手机端微信支付
*/
@OrderHandlerType(source = "mobile",payMethod = "wechat")
@Slf4j
public class MobileWeChatOrderHandler implements OrderHandler {
@Override
public void handle(Order order) {
log.info("处理手机端微信支付的订单");
}
}
3策略Map封装,根据key在Map里找到对应的策略应对
1)将所有策略(实现了策略注解的类)封装到map中
2)根据传入的策略值(key),在map中找到value(对应的策略具体实现类)
/**
* @author czh
* @discription orderHandlerMap 它的key为对应的订单处理器handler,通过Autowired去
* 初始化orderHandlerMap,即从OrderHandlerMap中根据订单来源获取对应的OrderHandler,
* 然后执行OrderHandler.handle方法即可
*/
@Service
@Slf4j
public class OrderService {
private Map<OrderHandlerType, OrderHandler> orderHandlerMap;
/**
*
* 会对List<OrderHandLer>自动进行赋值,赋值为实现了orderHandler的类对象,
* @param
* @return 返回信息
*/
@Autowired
public void setOrderHandlerMap(List<OrderHandler> orderHandlers) {
/**注入各种类型的订单处理类 */
orderHandlerMap = orderHandlers.stream().collect(Collectors.toMap(orderHandler -> AnnotationUtils.findAnnotation(orderHandler.getClass(), OrderHandlerType.class), v -> v, (v1, v2) -> v1));
orderHandlerMap.forEach((k,v)->{
OrderHandlerType orderHandlerType = k;
// log.info(orderHandlerType.toString());
// log.info("k为"+k+"value值为"+v);
});
}
public void orderService(Order order) {
/**通过订单来源,以及支付方式获取对应的handler */
/**通过订单来源,支付方式找到对应的注解类 例如,source="pc",payMethod="Ali" ,再从map集合中取到对应的handler */
OrderHandlerType orderHandlerType = new OrderHandlerTypeImpl(order.getSource(), order.getPayMethod());
OrderHandler orderHandler = orderHandlerMap.get(orderHandlerType);
orderHandler.handle(order);
}
}
用来比较对象(这个忽略就好,得有这个类)
/**
* @author czh
* @discription
*/
@Service
@NoArgsConstructor
@Slf4j
public class OrderHandlerTypeImpl implements OrderHandlerType {
private String source;
private String payMethod;
OrderHandlerTypeImpl(String source, String payMethod) {
this.source = source;
this.payMethod = payMethod;
}
@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 orderHandlerType = (OrderHandlerType) obj;
return source.equals(orderHandlerType.source()) && payMethod.equals(orderHandlerType.payMethod());
}
@Override
public String source() {
return source;
}
@Override
public String payMethod() {
return payMethod;
}
@Override
public Class<? extends Annotation> annotationType() {
return OrderHandlerType.class;
}
}
4调用
/**
* @author czh
* @discription
*/
@RequestMapping("/celue")
@RestController
public class HandlerController {
@Autowired
OrderService orderService;
@GetMapping("/test")
public String test(@RequestBody Order order) {
orderService.orderService(order);
return "";
}
}
至此策略模式实现