美文网首页
设计模式——装饰器模式

设计模式——装饰器模式

作者: DevilRoshan | 来源:发表于2020-11-06 00:01 被阅读0次

什么是装饰器模式?

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

实现

// 通过构造方法获取人,再通过show()方法传递出去。
type Person struct {
    name string
}

func NewPerson() *Person {
    return &Person{}
}

func NewPersonWithName(name string) *Person {
    return &Person{name: name}
}

func (this *Person) Show() {
    fmt.Println(this.name + "的装扮:")
}

// 通过构造方法传递参数给show()方法,show()方法为重写父类Person类的方法。
type Finery struct {
    *Person
    component *Person
}

func NewFinery() *Finery {
    return &Finery{}
}

func (this *Finery) Decorate(component *Person) {
    this.component = component
}

func (this *Finery) Show() {
    if this.component != nil {
        this.component.Show()
    }
}

//  具体服装类,TShirt类
type TShirts struct {
    Finery
}

func NewTShirts() *TShirts {
    return &TShirts{}
}

func (this *TShirts) Show() {
    this.Finery.Show()
    fmt.Println("T恤")
}

func TestNewFinery(t *testing.T) {
    adam := NewPersonWithName("adam")
    ts := NewTShirts()
    ts.Decorate(adam)
    ts.Show()
}

/*
=== RUN   TestNewFinery
adam的装扮:
T恤
--- PASS: TestNewFinery (0.00s)
PASS
*/

优点

  • 装饰类和被装饰类可以独立发展,而不会相互耦合。它有效地把类的核心职责和装饰功能分开了;
  • 装饰模式是继承关系的一个替代方案;
  • 装饰模式可以动态地扩展一个实现类的功能。

缺点

  • 多层装饰比较复杂。比如我们现在有很多层装饰,出了问题,一层一层检查,最后发现是最里层的装饰出问题了,想想工作量都害怕。

使用场景

  • 需要扩展一个类的功能时;
  • 需要动态地给一个对象增加功能,并可以动态地撤销时;
  • 需要为一批的兄弟类进行改装或加装功能时。

相关文章

网友评论

      本文标题:设计模式——装饰器模式

      本文链接:https://www.haomeiwen.com/subject/wvlpvktx.html