如何通过Domino式顺序操作列表管理Order对象?求优化方案
解决方案
核心是用Kotlin标准库的fold函数替代forEach,实现链式的结果传递,同时满足开闭原则。
代码实现
保持原接口不变
interface IOrderService { fun operation(order: Order): Order }
修改doStuff函数
fun doStuff(order: Order): Order { // 用fold累积处理结果,每个服务的输出作为下一个服务的输入 return orderServices.fold(order) { processedOrder, service -> service.operation(processedOrder) } }
逻辑说明
fold是Kotlin集合的标准操作,接收初始值(这里是传入的原始Order)和一个累积函数- 每次迭代时,
processedOrder是上一个服务处理后的结果,当前服务基于这个结果执行operation,返回新的Order作为下一次迭代的输入 - 所有服务执行完成后,返回最终处理后的
Order,完全还原了最初的链式调用逻辑
优势
- 符合开闭原则:新增服务只需实现
IOrderService并加入orderServices列表,无需修改doStuff函数的核心逻辑 - 代码简洁:利用标准库函数实现,无需额外设计模式
- 灵活扩展:可以通过调整
orderServices列表的顺序、动态添加/移除服务,轻松控制处理流程
内容的提问来源于stack exchange,提问作者davide.ferrari
相关产品推荐
相关产品推荐

