在任何策略模式示例中,都可以在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);
}
}
答案 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
。