Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据枚举值选择服务类型_Java_Design Patterns_Enums - Fatal编程技术网

Java 根据枚举值选择服务类型

Java 根据枚举值选择服务类型,java,design-patterns,enums,Java,Design Patterns,Enums,我想创建一种工厂模式,但我很挣扎 //OperationType is an Enum public interface SettlementService<OperationType>{ void settleOperation(Order order); } 代码显然不起作用,但希望您能理解。如何实现这一点?要使用工厂模式实现结算服务,您不需要在界面中了解泛型类型 public interface SettlementService { void settleO

我想创建一种工厂模式,但我很挣扎

//OperationType is an Enum
public interface SettlementService<OperationType>{
    void settleOperation(Order order);
}

代码显然不起作用,但希望您能理解。如何实现这一点?

要使用工厂模式实现
结算服务
,您不需要在
界面
中了解泛型类型

public interface SettlementService {
    void settleOperation(Order order);
}
此外,它实现的类如下所示-

public class ClientSettlementService implements SettlementService {
    @Override
    public void settleOperation(Order order) {
        System.out.println("clients!!");
    }
}

public class CustomerSettlementService implements SettlementService {
    @Override
    public void settleOperation(Order order) {
        System.out.println("customers!!");
    }
}
然后,基于
OperationType
enum,要构建的工厂将如下所示

public class SettlementFactory {
    private SettlementService provideService(OperationType operationType) {
        switch (operationType) {
            case CLIENT:
                return new ClientSettlementService();
            case CUSTOMER:
                return new CustomerSettlementService();
            default:
                throw new UnsupportedOperationException("Unsupported operation type!");
        }
    }
}
然后,您可以使用此工厂结算给定的
订单
,如下所示:

private void settleOrder(Order order) {
    SettlementFactory settlementFactory = new SettlementFactory();
    SettlementService settlementService = settlementFactory.provideService(order.getOperationType());
    settlementService.settleOperation(order);
}

如果您偶然发现Factory类是开销类,并且希望将提供服务的功能简化为使用它的相同方法,则可以使用
Map
并处理提供的服务,例如:

private void settleOrder(Order order) {
    Map<OperationType, SettlementService> typeSettlementServiceMap =
            Map.of(OperationType.CLIENT, new ClientSettlementService(),
                    OperationType.CUSTOMER, new CustomerSettlementService());
    SettlementService settlementService = typeSettlementServiceMap.get(order.getOperationType());
    if (settlementService == null) throw new UnsupportedOperationException("..message..");
    settlementService.settleOperation(order);
}
private void结算订单(订单){
地图类型结算服务地图=
Map.of(OperationType.CLIENT,new ClientSettlementService(),
OperationType.CUSTOMER,新CustomerSettlementService());
沉降器服务沉降器服务=类型沉降器服务映射.get(order.getOperationType());
如果(settlementService==null)抛出新的UnsupportedOperationException(“…消息…”);
结算服务。结算操作(订单);
}

在您的界面中
结算服务
在哪里使用类型绑定?我真的不知道。该类型仅用于确定我要使用的服务。
private void settleOrder(Order order) {
    SettlementFactory settlementFactory = new SettlementFactory();
    SettlementService settlementService = settlementFactory.provideService(order.getOperationType());
    settlementService.settleOperation(order);
}
private void settleOrder(Order order) {
    Map<OperationType, SettlementService> typeSettlementServiceMap =
            Map.of(OperationType.CLIENT, new ClientSettlementService(),
                    OperationType.CUSTOMER, new CustomerSettlementService());
    SettlementService settlementService = typeSettlementServiceMap.get(order.getOperationType());
    if (settlementService == null) throw new UnsupportedOperationException("..message..");
    settlementService.settleOperation(order);
}