流式接口

给对象的属性赋值或者为对象添加一系列配置,正是流式接口(Fluent Interface)最经典、最适用的场景。

什么时候用流式接口最好?

当一个对象在创建或初始化时,需要配置多个属性或执行多个步骤,而且这些步骤之间是平行的、可组合的,使用流式接口就非常合适。

// 传统写法:繁琐,且容易忘记调用某个初始化方法
var builder = new QueryBuilder();
builder.SetTable("Users");
builder.SetLimit(10);
builder.OrderBy("Age");
builder.Where("Age > 18");
var result = builder.Build();
// 流式写法:像说话一样连贯,一气呵成
var result = new QueryBuilder()
    .SetTable("Users")
    .Where("Age > 18")
    .OrderBy("Age")
    .SetLimit(10)
    .Build();

设计一个简单的例子:构建一个汉堡

假设我们有一个Burger类,我们需要通过一个BurgerBuilder来定制它。

第一步:定义产品类 (Burger)
public class Burger
{
    public bool HasCheese { get; set; }
    public bool HasBacon { get; set; }
    public int PattyCount { get; set; } = 1;
}
第二步:设计流式接口 (BurgerBuilder)

核心秘诀:每个配置方法最后都return this;

public class BurgerBuilder
{
    private readonly Burger _burger = new Burger();

    // 添加奶酪
    public BurgerBuilder AddCheese()
    {
        _burger.HasCheese = true;
        return this; // 关键:返回当前实例,允许继续链式调用
    }

    // 添加培根
    public BurgerBuilder AddBacon()
    {
        _burger.HasBacon = true;
        return this; // 关键:返回当前实例
    }

    // 设置肉饼数量
    public BurgerBuilder SetPatties(int count)
    {
        _burger.PattyCount = count;
        return this; // 关键:返回当前实例
    }

    // 最终构建方法(通常不返回 this,而是返回最终对象)
    public Burger Build()
    {
        return _burger;
    }
}
第三步:如何使用
// 极其优雅地创建一个双层培根芝士汉堡
Burger myBurger = new BurgerBuilder()
    .AddCheese()
    .AddBacon()
    .SetPatties(2)
    .Build();
posted @ 2026-07-21 16:54  大馒头不好吃  阅读(2)  评论(0)    收藏  举报