Skip to content
← 返回设计模式列表
设计意图与对象责任

装饰器 ​

用包装对象叠加行为。

结构型

说明 ​

日志、缓存等横切能力可逐层包装,而不改变原实现。

分析 ​

WithPrefix 接收一个 Handler 并返回同签名的新 Handler,因此可继续叠加缓存、日志或鉴权包装。调用顺序决定执行顺序,外层包装先接收输入。

包装器与原 Handler 签名一致,WithPrefix 先改输入再调用 next。嵌套两个前缀时,外层先处理输入,内层的前缀会出现在最终文本更前面;必须按真实执行方向推导结果。缓存、鉴权等装饰顺序更影响语义,不能把可组合误解为可以任意交换。

查看图表代码

适用前提与边界 ​

装饰器适合添加与核心任务正交的行为,但包装层过多会使调试路径变长。 只有接口适配或独立变化确实存在时,才增加额外包装层。

示例输入与调用 ​

go
echo := Handler(func(s string) string { return s })
	decorated := WithPrefix(echo, "hello ")
	fmt.Println(decorated("Go"))

运行输出 ​

text
hello Go

完整 Go 示例 ​

go
package main

import "fmt"

type Handler func(string) string

func WithPrefix(next Handler, prefix string) Handler {
	return func(s string) string { return next(prefix + s) }
}

func main() {
	echo := Handler(func(s string) string { return s })
	decorated := WithPrefix(echo, "hello ")
	fmt.Println(decorated("Go"))
}

继续阅读