模式定义
动静(组合)地给一个对象减少一些额定的职责,就减少性能而言,Decorator模式比生成子类(继承)更为灵便(打消反复代码并且缩小子类个数)
类图
利用场景
扩大一个类的性能或给一个类增加附加职责
长处
1.合乎开闭准则
2.不扭转原有对象的状况下给一个对象扩大性能
3.应用不同的组合能够实现不同的成果
要点总结
- 通过采纳组合而非继承的手法,Decorator模式实现了在运行时动静扩大对象性能的能力,而且能够依据须要扩大多个性能。防止了应用继承带来的“灵活性差”和“多子类衍生问题”
- Decorator类在接口上体现为is-a 的继承关系,即Decorator类继承了Component类所具备的接口,但在实现上又体现为has-a的组合关系,即Decorator类又应用了另外一个Component类
- Decorator模式的目标并非解决“多子类衍生的多继承”问题,Decorator模式利用的要点在于解决“主体类在多个问题方向上的扩大性能”--是为“装璜”的含意
Go语言代码实现
工程目录
Decorator.go
package Decorator import "fmt" //定义一个形象组件 type Component interface { Operate() } //实现一个具体的组件:组件1 type Compontent1 struct { } func (c1 *Compontent1) Operate() { fmt.Println("c1 operate") } //定义一个形象的装璜者 type Decorator interface { Component Do() //这是一个额定的办法 } //实现一个具体的装璜者 type Decorator1 struct { c Component } func (d1 *Decorator1) Do() { fmt.Println("产生了装璜行为") } func (d1 *Decorator1) Operate() { d1.Do() d1.c.Operate() }
Decorator_test.go
package Decorator import "testing" func TestCompontent1_Operate(t *testing.T) { c1 := &Compontent1{} c1.Operate() } func TestDecorator1_Operate(t *testing.T) { d1 := &Decorator1{} c1 := &Compontent1{} d1.c = c1 d1.Operate() }