简单示例

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

关键点:

  1. 每个方法返回this: 每个操作方法(Add, Subtract等)都返回当前对象的引用(this)。这允许在同一个对象上连续调用方法。
  2. 方法链: 你可以像示例中那样连续调用多个方法,形成一个方法链。
  3. 可读性: 链式方法调用通常能提高代码的可读性,特别是在处理复杂操作时。
  4. 灵活性: 这种模式允许你以任何顺序组合操作,非常灵活。

要创建自己的链式接口,只需确保相关方法返回对象本身(通常是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操作、数据库事务或任何可能失败的连续操作。

最后修改:2024 年 09 月 05 日
如果觉得我的文章对你有用,请随意赞赏