使用自定義注解和策略模式去掉if-else


一:寫自定義注解

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);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM