策略模式-使用枚举实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

记录另一种策略模式的实现:使用枚举实现策略模式

一、request

@Data
public class TrafficRequest {
    /**
     * 枚举类型
     */
    private StrategyEnum strategyEnum;
}

二、controller

@RestController
@RequestMapping("strategy")
@RequiredArgsConstructor
public class TrafficController {

    private final TrafficService trafficService;


    @PostMapping(value = "test",name = "使用枚举实现策略模式")
    public String getStrategyName(@RequestBody TrafficRequest trafficRequest){
        return trafficService.getStrategyName(trafficRequest);
    }

}

三、controller的接口类

public interface TrafficService {

    String getStrategyName(TrafficRequest trafficRequest);
}

四、controller的接口类的实现类

@Service
@RequiredArgsConstructor
public class TrafficServiceImpl implements TrafficService {

    private final StrategyFactory strategyFactory;

    @Override
    public String getStrategyName(TrafficRequest trafficRequest) {
        StrategyService service = strategyFactory.getService(trafficRequest.getStrategyEnum());
        return service.getTraffic(trafficRequest);
    }
}

五、策略模式的工厂类

@Slf4j
@Component
public class StrategyFactory {

    private static final Map<StrategyEnum, StrategyService> STRATEGY_SERVICE_MAP = new HashMap<>();

    @Autowired
    public StrategyFactory(List<StrategyService> strategyServices) {

        Map<StrategyEnum, StrategyService> itemDataMap = strategyServices.stream().collect(Collectors.toMap(StrategyService::getType, service -> service));
        STRATEGY_SERVICE_MAP.putAll(itemDataMap);
   
    }

    public StrategyService getService(StrategyEnum strategyEnum){
        return STRATEGY_SERVICE_MAP.get(strategyEnum);
    }

}

六、策略模式的枚举类

public enum StrategyEnum {
    CAR,
    SHIP,
    PLANE
}

七、策略模式的接口类

public interface StrategyService {

    StrategyEnum getType();

    String getTraffic(TrafficRequest trafficRequest);
}

八、策略模式的接口类

public abstract class AbstractStrategyService implements StrategyService {
}

九、三个策略类的实现类

@Service
public class CarServiceImpl extends AbstractStrategyService {

    @Override
    public StrategyEnum getType() {
        return StrategyEnum.CAR;
    }

    @Override
    public String getTraffic(TrafficRequest trafficRequest) {
        return StrategyEnum.CAR.name();
    }

}
@Service
public class PlaneServiceImpl extends AbstractStrategyService {

    @Override
    public StrategyEnum getType() {
        return StrategyEnum.PLANE;
    }

    @Override
    public String getTraffic(TrafficRequest trafficRequest) {
        return StrategyEnum.PLANE.name();
    }

}
@Service
public class ShipServiceImpl extends AbstractStrategyService {

    @Override
    public StrategyEnum getType() {
        return StrategyEnum.SHIP;
    }

    @Override
    public String getTraffic(TrafficRequest trafficRequest) {
        return StrategyEnum.SHIP.name();
    }

}

总结

感兴趣的可以看下使用@Autowired+@Component(“one”)的实现策略模式。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
枚举策略模式(Strategy Pattern)是行为设计模式的一种,它允许你定义一系列算法,并将每个算法封装在独立的类中,然后将它们作为参数传递给一个共同的接口或抽象类。在Java中,枚举类型非常适合用来实现策略模式,因为枚举可以提供有限且预定义的选项。 Java枚举策略模式实现通常包括以下几个步骤: 1. **接口或抽象类**:定义一个策略接口或抽象类,包含具体执行操作的方法。例如: ```java public interface PaymentStrategy { void processPayment(double amount); } ``` 2. **枚举类**:为每种策略创建一个枚举类,继承自策略接口或实现抽象类,并实现具体方法。比如: ```java public enum PaymentMethod implements PaymentStrategy { CASH("Cash", amount -> System.out.println("Processing cash payment...")), DEBIT_CARD("Debit Card", amount -> System.out.println("Processing debit card payment...")); private String name; private Function<Double, Void> processPayment; PaymentMethod(String name, Function<Double, Void> processPayment) { this.name = name; this.processPayment = processPayment; } @Override public void processPayment(double amount) { processPayment.apply(amount); } public String getName() { return name; } } ``` 3. **客户端使用**:在需要使用策略的地方,可以创建枚举类型的实例并调用其方法: ```java public class PaymentProcessor { private PaymentStrategy strategy; public void setPaymentStrategy(PaymentStrategy strategy) { this.strategy = strategy; } public void processPayment(double amount) { strategy.processPayment(amount); } } PaymentProcessor processor = new PaymentProcessor(); processor.setPaymentStrategy(PaymentMethod.CASH); processor.processPayment(100.0); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值