Builder Pattern、委托与Lambda表达式结合代码运行逻辑及写法答疑
问题1:代码第4行执行了什么操作?
第4行x(doorsBuilder)的作用是执行你调用WithDoors方法时传入的Action委托,同时把第3行刚实例化的DoorsBuilder对象作为参数传入这个委托。本质就是把新创建的门构造器交给你预先定义的配置逻辑去做属性设置。
问题2:第0行调用WithDoors函数时,实际传入的参数是什么?
实际传入的是一个符合Action<DoorsBuilder>签名的匿名Lambda函数,逻辑如下:
- 该函数接收一个
DoorsBuilder类型的输入参数(也就是Lambda里的变量x) - 函数内部会调用这个
DoorsBuilder实例的WithDoors方法,传入参数4,完成「车门数量设为4」的配置
问题3:易读版改写代码
你可以把链式调用和嵌套Lambda拆开,拆解每一步的逻辑,理解成本会低很多:
// 1. 先实例化汽车构造器 var carBuilder = new CarBuilder(); // 2. 单独定义车门的配置逻辑,对应原来的Lambda表达式 Action<DoorsBuilder> configureDoors = (doorsBuilder) => { doorsBuilder.WithDoors(4); }; // 3. 调用WithDoors方法,传入上面的配置逻辑 carBuilder.WithDoors(configureDoors); // 4. 最后构造出汽车对象 var car = carBuilder.Build();
你也可以给WithDoors方法加注释辅助理解逻辑:
public CarBuilder WithDoors(Action<DoorsBuilder> configure) { // 实例化车门构造器 var doorsBuilder = new DoorsBuilder(); // 执行传入的配置逻辑,设置车门参数 configure(doorsBuilder); // 用配置好的车门构造器生成车门对象,添加到当前正在构造的汽车上 _car.AddDoors(doorsBuilder.Build()); // 返回当前汽车构造器实例,支持链式调用 return this; }
内容的提问来源于stack exchange,提问作者tylkonachwile
相关产品推荐
相关产品推荐

