没有工厂的情况下应将策略模式置于何处?

时间:2019-02-19 10:24:06

标签: java c# design-patterns

在任何策略模式示例中,都可以在Main函数中创建每种可能的策略,例如:

Context cn = new Context(new CQuickSorter());
cn.Sort(myList);

cn = new Context(new CMergeSort());
cn.Sort(myList);

但是在某些地方,我们必须选择应该使用的策略,在何处放置“开关”以选择正确的策略?用一种方法?我看到带有“ switch”方法的类返回了OBJECT-正确的策略类实例,但是那是工厂而不是策略模式。

没有工厂的战略模式应该在哪里“切换”?我的方法如下所示-可以吗?

enum Operation
{
    Addition,
    Subtraction
}

public interface IMathOperation
{
    double PerformOperation(double A, double B);
}

class AddOperation : IMathOperation
{
    public double PerformOperation(double A, double B)
    {
        return A + B;
    }
}

class SubtractOperation : IMathOperation
{
    public double PerformOperation(double A, double B)
    {
        return A - B;
    }
}

class CalculateClientContext
{
    private IMathOperation _operation;

    public CalculateClientContext(IMathOperation operation)
    {
        _operation = operation;
    }

    public double Calculate(int value1, int value2)
    {
        return _operation.PerformOperation(value1, value2);
    }
}

class Service
{
    //In this method I have switch
    public double Calculate(Operation operation, int x, int y)
    {
        IMathOperation mathOperation = null;

        switch (operation)
        {
            case Operation.Addition:
                mathOperation = new AddOperation();
                break;
            case Operation.Subtraction:
                mathOperation = new SubtractOperation();
                break;
            default:
                throw new ArgumentException();
        }

        CalculateClientContext client = new CalculateClientContext(mathOperation);
        return client.Calculate(x, y);
    }
}

2 个答案:

答案 0 :(得分:1)

最灵活的方法是尽可能长地延迟决策(“切换”)。例如,如果您从这样的内容开始:

Context cn = new Context(); // Don't care about the sorter yet...
cn.Sort(new CQuickSorter(), myList); // OK, NOW the sorter is needed, let's inject it now.

您可以在致电object.Sort()之前随时做出决定。该决定可以在一个简单的if-else块中,也可以在一个复杂的工厂中实施。归根结底,最佳实施将取决于项目的复杂性。因此,没有硬性规定可以将开关放置在何处。

作为练习,您可以应用各种创建模式来查看它们如何发挥作用。这样可以帮助您了解何时使用每种设计模式。

答案 1 :(得分:0)

在应用依赖注入时,应在composition root内实例化域对象并将其连接在一起(即提供其依赖,例如策略)。用现代的实用术语来说,这意味着您的DI容器将实例化并根据配置为上下文(客户端)对象提供策略。没有switch