简单示例
public class Calculator
{
private int result;
public Calculator()
{
result = 0;
}
public Calculator Add(int number)
{
result += number;
return this;
}
public Calculator Subtract(int number)
{
result -= number;
return this;
}
public Calculator Multiply(int number)
{
result *= number;
return this;
}
public Calculator Divide(int number)
{
if (number != 0)
{
result /= number;
}
return this;
}
public int GetResult()
{
return result;
}
}
// 使用示例
Calculator calc = new Calculator();
int result = calc.Add(5).Multiply(2).Subtract(3).Divide(2).GetResult();
Console.WriteLine(result); // 输出: 3
关键点:
- 每个方法返回this: 每个操作方法(Add, Subtract等)都返回当前对象的引用(this)。这允许在同一个对象上连续调用方法。
- 方法链: 你可以像示例中那样连续调用多个方法,形成一个方法链。
- 可读性: 链式方法调用通常能提高代码的可读性,特别是在处理复杂操作时。
- 灵活性: 这种模式允许你以任何顺序组合操作,非常灵活。
要创建自己的链式接口,只需确保相关方法返回对象本身(通常是this)。这样,每次方法调用后,你都能继续在返回的对象上调用更多方法。
public class OperateResult
{
public bool IsSuccess { get; set; }
// 其他属性...
public OperateResult Then(Func<OperateResult> nextOperation)
{
if (this.IsSuccess)
{
return nextOperation();
}
return this;
}
}
扩展 OperateResult 类:
public class OperateResult
{
public bool IsSuccess { get; set; }
public string ErrorMessage { get; set; }
// 其他属性...
public OperateResult Then(Func<OperateResult> nextOperation)
{
return IsSuccess ? nextOperation() : this;
}
public OperateResult Catch(Action<OperateResult> errorHandler)
{
if (!IsSuccess)
{
errorHandler(this);
}
return this;
}
}
- 添加一个
Then
方法,这个方法接受一个返回 OperateResult 的函数作为参数。 Then
方法检查当前操作是否成功,如果成功则执行下一个操作,否则直接返回当前的失败结果。
链式调用:
- 每个
Write
方法返回一个 OperateResult 对象。 - 通过
Then
方法,我们可以将多个操作链接在一起。 - 如果任何一个操作失败,链式调用就会在那里停止,返回失败的结果。
lambda 表达式:
- 使用
() =>
语法创建简单的lambda表达式,代表每一个Write
操作。
简化的错误处理:
- 不再需要每次操作后都显式检查
IsSuccess
。 Then
方法内部处理了这个逻辑,只有在前一个操作成功时才会执行下一个操作。
函数式编程思想:
- 这种方法采用了函数式编程的概念,将操作视为可以组合的函数。
- 它提高了代码的可读性和可维护性,同时减少了重复的错误检查代码。
方法链:
- 最终结果是一个优雅的方法链,清晰地表示了操作的顺序。
可以应用于许多需要按顺序执行多个操作,并在任何步骤失败时立即停止的场景。它特别适合处理I/O操作、数据库事务或任何可能失败的连续操作。