20210219深化理解装饰者模式 - ziyouzy/2021blog GitHub Wiki

很久以前就看过的这篇文章:

https://studygolang.com/articles/6612

怎么说呢,“装饰者”模式和“组合”模式是不同的,后者是结构类里嵌套一个结构类或者接口组合成新的结构体
从某些角度上将,装饰者模式需要借助组合来实现,也就是文中演示的Egg结构类:

type Noddles interface {
    Description() string
    Price() float32
}

type Egg struct {
    noddles Noddles
    name    string
    price   float32
}

func (p Egg) SetNoddles(noddles Noddles) {
    p.noddles = noddles
}

func (p Egg) Description() string {
    return p.noddles.Description() + "+" + p.name
}

func (p Egg) Price() float32 {
    return p.noddles.Price() + p.price
}

可以看到Egg不仅仅包含了Noddles接口,也实现了Noddles接口
内部字段Noddles的作用仅仅是为了承载任何一个实现了Noddles结构类的容器,和Egg自身实现Noodles接口没有任何关系,两者所扮演的角色完全不同,也在逻辑上没有任何联系
回到正题,文章里所述:装饰者模式适用的场景是:

装饰者模式装饰者和被装饰者拥有相同的类型(相同的超类),目的是为了增强功能或者方便使用

这里所说的“增强功能”其实增强的是“被装饰者”的功能,装饰者只是被装饰者的一件“装备”,这一切的做好后,可以实现“方便使用”
更重要的是,之所以让他们都实现同一个接口,主要目的在于可以实现“套娃”的属性,比如这个“加蛋”的操作,加蛋后的对象是可以再次作为另一个“装备”的内部字段(就算还是Egg也是可以的)从而实现“再次加蛋”

于是乎,对于我目前需要处理的Signal和Error,似乎并不需要装饰着模式,有点小才大用了