C#:使用接口和委托
介绍
您是否遇到过包含大量 if-else 逻辑的代码?大多数情况下,当我们看到这种逻辑时,这是一个策略问题。有人试图使用最原始的语言工具“if”语句来解决问题。
然而,当谈到面向对象编程时,重要的是要理解代码需要可重用、可测试和可扩展。这就是策略模式派上用场的地方。让我们看一个例子。(示例是 C# 语言,但该概念可应用于任何面向对象语言)
首先,我们将看到用简单的“if”语句编写的代码。
public int Calculate(int x, int y)
{
if(action == "Add")
{
return x+y;
}
else if(action == "Sub")
{
return x-y;
}
else if
......
.... and so on.
}
然而,这种方法存在问题:
如果要添加另一个策略(比如说除法),则必须更改类中的代码,从而修改类本身。然而,这不是一个好的做法。它违反了 OCP(开放封闭原则)的原则。OCP 表示类可以扩展,但不能修改。
后面有太多“如果”阻碍。
硬编码字符串。我确信没人想要它们。作为计数器,我们可以使用枚举。然而,当存在更快的方法时,这会增加另一个依赖项。
删除一个策略非常耗时。
策略模式
现在让我们使用策略模式 - 这是一种允许您即时选择策略的模式。策略取决于对象的类型。此模式背后的原则是“针对接口编程,而不是针对实现编程”。这使得最终的解决方案易于测试、扩展和维护。
我们首先定义接口。
public interface ICalculate
{
int Calculate(int x, int y);
}
现在我们可以实现这个接口了。
public class Add : ICalculate
{
#region ICalculate Members
public int Calculate(int x, int y)
{
return x + y;
}
#endregion
}
public class Subtract : ICalculate
{
#region ICalculate Members
public int Calculate(int x, int y)
{
return x - y;
}
#endregion
}
这就是我们所说的代码。
ICalculate calculate = new Add(); int sum = calculate.Calculate(a , b);
由于对象属于Add类型,我们无需检查类型(如上文所述)即可调用相应函数。因此,在运行时,将调用Add类中的Calculate方法。
如何添加新的策略?这就像添加另一个类一样简单。我们只需要确保它实现接口。让我们创建一个名为Multiply 的新策略,该策略实现ICalculate。
public class Multiply : ICalculate
{
#region ICalculate Members
public int Calculate(int num1, int num2)
{
return num1 * num2;
}
#endregion
}
一些观察:
这个例子并不违反 OCP。事实上,它支持 OCP,因为我们不修改特定的类;我们的策略是创建一个具有特定定义功能的新类。
如果我们需要删除一个策略,我们可以从代码中删除该类,并且它不会影响任何其他代码(就像在遗留代码中一样 - 我们必须删除那个 if-else 语句)。
它没有硬编码字符串。
使用委托的编码策略模式?
使用委托的编码策略模式非常简单。
public class Calculator
{
public static int Add(int x, int y)
{
return x + y;
}
public static int Subtract(int x, int y)
{
return x - y;
}
public static int Multiply(int x, int y)
{
return x * y;
}
public static int Divide(int x, int y)
{
return x / y;
}
}
现在,我们可以使用委托来调用此代码。
Func calculate = Calculator.Add;
int sum = calculate(100, 50);
或者
calculate = Calculator.Subtract;
int difference = calculate(100, 50);
这行代码是不是太多了?好吧,既然如此,我们可以直接用内联方式编写该方法。现在,我们不需要 Calculator 类了。
Func calculate;
calculate = (x, s) => x + s;
结论
委托和接口之间的主要区别在于,虽然委托可以减少代码量并提高代码的可读性,但您必须小心使用它们,否则最终可能会牺牲可测试性。即使需要更多代码,使用接口进行编码通常也更可靠。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~