流式接口
给对象的属性赋值或者为对象添加一系列配置,正是流式接口(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();
浙公网安备 33010602011771号