【问题标题】:Pattern Strategy vs Switch OR How to handle a large number of different operationsPattern Strategy vs Switch OR 如何处理大量不同的操作
【发布时间】:2021-01-19 07:04:11
【问题描述】:

我想在代码中使用不同的操作来摆脱 Switch。在这种情况下可以使用策略模式来完成吗(或者有其他方法吗?):

public interface Strategy {
    BigDecimal minus(BigDecimal a, BigDecimal b);
    BigDecimal sum(BigDecimal a, BigDecimal b);
    BigDecimal pow(BigDecimal a, int n);
}

public class Minus implements Strategy {
    public BigDecimal minus(BigDecimal a, BigDecimal b) {
        return a.subtract(b);
    }
}

public class Sum implements Strategy{
    public BigDecimal sum(BigDecimal a, BigDecimal b) {
        return a.add(b);
    }

    public BigDecimal pow(BigDecimal a, int n) {
        return a.pow(n);
    }
}

public class Calc {
    private Strategy strategy;
    private BigDecimal a;
    private BigDecimal b;
    private int n;

    public Calc(Strategy strategy, BigDecimal a, BigDecimal b, int n) {
        this.strategy = strategy;
        this.a = a;
        this.b = b;
        this.n = n;
    }

    public void calculate(String operation) {
        switch (operation) {
            case "SUM":
                strategy.sum(a, b);
                break;
            case "POW":
                strategy.pow(a, n);
                break;
            case "MINUS":
                strategy.minus(a, b);
        }
    }
}

ps:代码不起作用,因为我不明白如何在不从 Sum 类中删除 pow 方法的情况下实现 Strategy 接口。

【问题讨论】:

    标签: java design-patterns switch-statement strategy-pattern


    【解决方案1】:

    您对策略模式存在某种误解。简单地说,通过实现它,你就有了类,每个类都提供了一种行为的特殊表现。您可以从所有这些可能的表现形式中选择哪一种来用于您的特殊情况。 你的界面策略 - 让我们更好地命名它 TwoParamOperation 然后看起来像这样:

    public interface TwoParamOperation {
        BigDecimal compute(BigDecimal operand1, BigDecimal operand2);
    }
    

    你的实际实现可能是:

    public class Minus implements TwoParamOperation{
        @Override
        public BigDecimal compute(BigDecimal operand1, BigDecimal operand2) {
            return operand1.subtract(operand2);
        }
    }
    
    public class Pow implements TwoParamOperation{
        @Override
        public BigDecimal compute(BigDecimal operand1, BigDecimal operand2) {
            return operand1.pow(operand2.intValue());
        }
    }
    

    然后您必须实施一种机制来从这些策略中进行选择。您可以简单地将操作名称作为键,将策略实例作为值的映射:

    公共类计算{

    private Map<String,TwoParamOperation> operations = new HashMap<>();
    
    public Calc(){
        add("MINUS", new Minus());
        add("POW", new Pow());
    }
    
    public void add(String opName,TwoParamOperation operation){
        operations.put(opName,operation);
    }
        
        public Optional<BigDecimal> calculate(String opName, BigDecimal operand1, BigDecimal operand2){
        TwoParamOperation operation = operations.get(opName);
        if (operation!= null){
            return Optional.of(operation.compute(operand1,operand2));
        }
        return Optional.empty();
    }
    

    }

    这样你甚至可以添加新的操作。删除由你决定.. 通过调用

    Calc calc = new Calc();
    
    BigDecimal x=calc.calculate("MINUS",BigDecimal.valueOf(2.3),BigDecimal.valueOf(42)).orElseThrow();
    

    如果执行了这样的操作,您将获得对两个参数的所选操作的结果。

    如果您需要其他参数或结果类型的操作,您可以将它们添加为其他接口的额外映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-07
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多