链式调用核心是配置方法返回 this(或 MyTool&),确保同一实例连续修改;终端方法如 send() 执行实际逻辑,不返回 this;C++ 中须用非 const 引用,避免值拷贝导致状态丢失。

核心是让每个配置或操作方法返回 this(当前对象引用),不新建副本、不中断链路,终端方法执行实际逻辑。这不是语法糖,而是明确的控制流设计。
返回引用而非值,避免状态丢失
若方法返回值类型(如 void 或 MyTool 值),链式会断裂或配置失效:
- ✅ 正确:返回
MyTool&(C++)或this(Java/C#),后续调用仍在同一实例上修改 - ❌ 错误:返回
MyTool(值拷贝),每次调用操作的是临时副本,原始对象未被更新 - ⚠️ 注意:C++ 中需声明为
MyTool&,不能是const MyTool&(无法调用非常量方法)
区分配置方法与终端方法
链式调用中两类方法职责清晰:
- 配置方法(如
timeout(3000)、withToken("abc")):只设字段/状态,返回this - 终端方法(如
send()、build()、execute()):触发实际行为,通常返回结果、void或不可再链的类型 - 不建议终端方法再返回
this,否则语义模糊(“发完还能再发?”)
轻量级实现无需框架,几行即可落地
以 C++ 简化 HTTP 工具为例:
struct HttpTool {
int timeout_ms = 5000;
std::string host;
<p>HttpTool& timeout(int ms) { timeout_ms = ms; return <em>this; }
HttpTool& host(const std::string& h) { host = h; return </em>this; }
void send() { /<em> 使用 timeout_ms 和 host 发起请求 </em>/ }
};调用:HttpTool().timeout(3000).host("api.example.com").send();
无内存分配、无锁、无虚函数——纯内联操作,适合嵌入式或高频调用场景。
可选增强:支持启用/禁用节点(责任链风格)
若工具需动态跳过某些步骤(如日志开关、中间件拦截),可在链节点中加入布尔标记:
- 用
std::vector<:function>></:function>存储处理器 - 每个处理器内部检查
enabled标志,false则直接返回true(表示跳过) - 启用/禁用只需改一个
bool字段,零拷贝、O(1) 切换


















