什么是装饰器模式?
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。
实现
// 通过构造方法获取人,再通过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
*/
优点
- 装饰类和被装饰类可以独立发展,而不会相互耦合。它有效地把类的核心职责和装饰功能分开了;
- 装饰模式是继承关系的一个替代方案;
- 装饰模式可以动态地扩展一个实现类的功能。
缺点
- 多层装饰比较复杂。比如我们现在有很多层装饰,出了问题,一层一层检查,最后发现是最里层的装饰出问题了,想想工作量都害怕。
使用场景
- 需要扩展一个类的功能时;
- 需要动态地给一个对象增加功能,并可以动态地撤销时;
- 需要为一批的兄弟类进行改装或加装功能时。
网友评论