/**
* 基类
*/
public interface LogisticsService {
boolean isCurrentLogistic(Integer type);
BigDecimal calculateFee(TransferFeeReq req);
}
/**
* 实现类1
*/
@Component
public class SFTransferCompany implements LogisticsService {
private final BigDecimal minDistance = BigDecimal.valueOf(80);
private final BigDecimal pickFee = BigDecimal.valueOf(70);
@Override
public boolean isCurrentLogistic(Integer type) {
return Objects.equals(type, 2);
}
@Override
public BigDecimal calculateFee(TransferFeeReq req) {
BigDecimal distance = minDistance.compareTo(req.getDistance()) > 0 ? minDistance : req.getDistance();
return distance.multiply(req.getUnitPrice()).add(pickFee);
}
}
/**
* 实现类2
*/
@Component
public class YTTransferCompany implements LogisticsService {
private final BigDecimal minDistance = BigDecimal.valueOf(40);
private final BigDecimal pickFee = BigDecimal.TEN;
@Override
public boolean isCurrentLogistic(Integer type) {
return Objects.equals(type, 1);
}
@Override
public BigDecimal calculateFee(TransferFeeReq req) {
BigDecimal distance = minDistance.compareTo(req.getDistance()) > 0 ? minDistance : req.getDistance();
return distance.multiply(req.getUnitPrice()).add(pickFee);
}
}
/**
* 工厂类
*/
@Service
public class LogisticsFactory {
@Autowired
private List<LogisticsService> logisticsServiceList;
public LogisticsService getService(TransferFeeReq req) {
Optional<LogisticsService> first =
logisticsServiceList.stream().filter(l -> l.isCurrentLogistic(req.getType())).findFirst();
if (first.isPresent()) {
return first.get();
}
throw new RuntimeException("非法类型");
}
}
/**
* 使用方式
*/
@Test
public void test() {
TransferFeeReq req = new TransferFeeReq(new BigDecimal(10), new BigDecimal(11), 2);
LogisticsService logisticsService = logisticsFactory.getService(req);
System.out.println(logisticsService.calculateFee(req));
}
策略模式
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 生活中我们经常会遇到选择问题,比如当我们要出去旅游时,会考虑是自驾、坐飞机还是坐火车前往目的地;或者在烹饪一条鱼时...
- 一个spring-boot自动注入策略工厂的starter (设计模式:策略模式 工厂模式 单例模式) 这个项目写...
- 策略模式 策略模式: 定义一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得各个算法之间可以相互替换策略...
- 在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开...
- 策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互...