一:寫自定義注解
package com.wing.cloud.base.modular.strategy; import java.lang.annotation.*; /** * <p> * 自定義策略注解 * </p> * * @author: heluwei * @Date: 2020/4/22 17:52 */ @Target(ElementType.TYPE) //作用在類上 @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited //子類可以繼承此注解 public @interface HandlerOrderType { /** * 策略類型 */ int value(); }
二:if-else的類型
package com.wing.cloud.base.modular.entity; import lombok.Builder; import lombok.Data; /** * <p> * if-else的條件 * </p> * * @author: heluwei * @Date: 2020/4/22 17:53 */ @Data @Builder public class OrderType { //免費訂單 public static final int FREE = 1; //半價訂單 public static final int HALF = 2; //打折訂單 public static final int DISCOUT = 3; }
三:定義所有的類型策略
package com.wing.cloud.base.modular.strategy; /** * <p> * 定義else的策略接口 * </p> * * @author: heluwei * @Date: 2020/4/22 17:54 */ public interface OrderStrategy { void handleOrder(Integer type); }
三個條件實現其接口
package com.wing.cloud.base.modular.strategy; import com.wing.cloud.base.modular.entity.OrderType; import org.springframework.stereotype.Component; /** * <p> * 實現策略接口 * </p> * * @author: heluwei * @Date: 2020/4/22 17:55 */ @Component @HandlerOrderType(OrderType.FREE) //使用注解標明策略類型 public class FreeOrderStrategy implements OrderStrategy { @Override public void handleOrder(Integer order) { System.out.println("----處理免費訂單----"); } }
package com.wing.cloud.base.modular.strategy; import com.wing.cloud.base.modular.entity.OrderType; import org.springframework.stereotype.Component; /** * <p> * 實現策略接口 * </p> * * @author: heluwei * @Date: 2020/4/22 17:55 */ @Component @HandlerOrderType(OrderType.DISCOUT) public class DiscoutOrderStrategy implements OrderStrategy { @Override public void handleOrder(Integer order) { System.out.println("----處理打折訂單----"); } }
package com.wing.cloud.base.modular.strategy; import com.wing.cloud.base.modular.entity.OrderType; import org.springframework.stereotype.Component; /** * <p> * 實現策略接口 * </p> * * @author: heluwei * @Date: 2020/4/22 17:55 */ @Component @HandlerOrderType(OrderType.HALF) public class HalfOrderStrategy implements OrderStrategy { @Override public void handleOrder(Integer order) { System.out.println("----處理半價訂單----"); } }
四:把策略實現類存放到spring容器中
package com.wing.cloud.base.modular.strategy; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; import java.util.Map; /** * <p> * 自定義spring處理器。把所有的策略類存儲到Map集合中。 * </p> * * @author: heluwei * @Date: 2020/4/22 17:58 */ @Component public class HandlerOrderProcessor implements ApplicationContextAware { /** * 獲取所有的策略Beanclass 加入HandlerOrderContext屬性中 * @param applicationContext * @throws BeansException */ @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { //獲取所有策略注解的Bean Map<String, Object> orderStrategyMap = applicationContext.getBeansWithAnnotation(HandlerOrderType.class); orderStrategyMap.forEach((k,v)->{ //獲取策略實現類 Class<OrderStrategy> orderStrategyClass = (Class<OrderStrategy>) v.getClass(); //獲取策略實現類的注解值。 int type = orderStrategyClass.getAnnotation(HandlerOrderType.class).value(); //將class加入HandlerOrderContext的map中,type作為key HandlerOrderContext.orderStrategyBeanMap.put(type,orderStrategyClass); }); } }
package com.wing.cloud.base.modular.strategy; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; /** * <p></p> * * @author: heluwei * @Date: 2020/4/22 17:57 */ @Component public class HandlerOrderContext { @Autowired private ApplicationContext applicationContext; //存放所有策略類Bean的map public static Map<Integer, Class<OrderStrategy>> orderStrategyBeanMap= new HashMap<>(); public OrderStrategy getOrderStrategy(Integer type){ Class<OrderStrategy> strategyClass = orderStrategyBeanMap.get(type); if(strategyClass==null){ throw new IllegalArgumentException("沒有對應的訂單類型"); } //從容器中獲取對應的策略Bean return applicationContext.getBean(strategyClass); } }
五:Service寫業務邏輯
package com.wing.cloud.base.modular.service; /** * <p> * 把寫的策略模式在Service業務類中運用。 * </p> * * @author: heluwei * @Date: 2020/4/22 18:01 */ public interface OrderService { void handleOrder(Integer orderType); }
package com.wing.cloud.base.modular.service.impl; import com.wing.cloud.base.modular.service.OrderService; import com.wing.cloud.base.modular.strategy.HandlerOrderContext; import com.wing.cloud.base.modular.strategy.OrderStrategy; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * <p></p> * * @author: heluwei * @Date: 2020/4/22 18:02 */ @Service public class OrderServiceImpl implements OrderService { @Autowired HandlerOrderContext handlerOrderContext; @Override public void handleOrder(Integer type) { //使用策略處理訂單 OrderStrategy orderStrategy = handlerOrderContext.getOrderStrategy(type); orderStrategy.handleOrder(type); } }
六:測試
@Test public void testStrategy(){ orderService.handleOrder(1); }