12、 Golang 设计模式:12_装饰器模式

1、介绍

动态地给一个对象添加一些额外的职责。就增加功能来说,相比生成子类更为灵活。

装饰器(Decorator)模式,是一种在运行期动态给某个对象的实例增加功能的方法。

Component:

** **对象的接口类,定义装饰对象和被装饰对象的共同接口;

ConcreteComponent:

 被装饰对象的类定义;

Decorator:

 装饰对象的抽象类,持有一个具体的被修饰对象,并实现接口类继承的公共接口;

ConcreteDecorator:

 具体的装饰器,负责往被装饰对象添加额外的功能;

2、示例

示例代码:

 package main

import "fmt"

type Component interface {
    Calc() int
}
type ConcreteComponent struct{}

func (*ConcreteComponent) Calc() int {
    return 0
}

//乘法修饰器
type MulDecorator struct {
    Component
    num int
}

func (d *MulDecorator) Calc() int {
    //return (d.Component.Calc()+1)*d.num
    return d.Component.Calc() * d.num
}
func NewMulDecorator(c Component, data int) *MulDecorator {
    return &MulDecorator{
        Component: c,
        num:       data,
    }
}

//加法修饰器
type AddDecorator struct {
    Component
    num int
}

func (d *AddDecorator) Calc() int {
    return d.Component.Calc() + d.num
}
func NewAddDecorator(c Component, data int) *AddDecorator {
    return &AddDecorator{
        Component: c,
        num:       data,
    }
}
func main() {
    var c Component
    //指针要先进行创建(初始化),不然直接赋值会出现空指针异常,即:给指针为nil的对象赋值
    //错误提示:panic: runtime error: invalid memory address or nil pointer dereference
    c = &ConcreteComponent{}
    c = NewAddDecorator(c, 10) //先调用加
    c = NewMulDecorator(c, 8) //在以上基础之上再执行乘法
    fmt.Println("加计算结果:", c.Calc())

}

UML图: