spring boot 策略模式實踐


package com.swt.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;

@RestController
@SpringBootApplication
public class DemoApplication {

	@Autowired
	private StrategyContext strategyContext;

	@RequestMapping("calculatePrice")
	public BigDecimal calculatePrice(String memberLevel) {
		return strategyContext.calculatePrice(memberLevel);
	}

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}

  

package com.swt.demo;

import java.math.BigDecimal;

public interface Strategy {

    /**
     * 計算價格
     * @return
     */
    BigDecimal calculatePrice();
}

  

package com.swt.demo;

import org.springframework.stereotype.Component;

import java.math.BigDecimal;

@Component("generalMember")
public class GeneralMember implements Strategy {
    @Override
    public BigDecimal calculatePrice() {
        // 普通會員沒有折扣,直接返回原價
        return new BigDecimal("100");
    }
}

  

package com.swt.demo;

import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

@Component("vipMember")
public class VipMember implements Strategy {
    @Override
    public BigDecimal calculatePrice() {
        // VIP會員打8折
        return new BigDecimal("80");
    }
}

  

package com.swt.demo;

import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

@Component("superMember")
public class SuperMember implements Strategy {
    @Override
    public BigDecimal calculatePrice() {
        // 超級會員打1折
        return new BigDecimal("10");
    }
}

  

package com.swt.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Service
public class StrategyContext {
    private final Map<String, Strategy> strategyMap = new ConcurrentHashMap<>();

    /**
     * 注入所以實現了Strategy接口的Bean
     * @param strategyList
     */
    /*@Autowired
    public StrategyContext(List<Strategy> strategyList) {
        strategyMap.clear();
        Integer index = 0;
        for (Strategy strategy : strategyList) {
            strategyMap.put(index.toString(), strategy);
            index++;
        }
    }*/

    /**
     * 注入所以實現了Strategy接口的Bean
     * @param strategyMap
     */
    @Autowired
    public StrategyContext(Map<String, Strategy> strategyMap) {
        this.strategyMap.clear();
        strategyMap.forEach((k, v)-> this.strategyMap.put(k, v));
    }

    /**
     * 計算價格
     * @param memberLevel   會員等級
     * @return              價格
     */
    public BigDecimal calculatePrice(String memberLevel) {
        return strategyMap.get(memberLevel).calculatePrice();
    }
}

  

 


免責聲明!

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



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