乐趣区

关于设计模式:设计模式装饰者Decorator模式

模式定义

动静(组合)地给一个对象减少一些额定的职责,就减少性能而言,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()}
退出移动版