专业编程基础技术教程

网站首页 > 基础教程 正文

Golang设计模式-装饰器模式

ccvgpt 2024-08-04 12:16:56 基础教程 26 ℃

装饰器模式

装饰器模式动态的把功能附加到对象上。若要扩展功能,装饰器提供了比继承更有弹性的替代方案。

在我们设计的过程中,要对扩展开放,对修改关闭,多用组合,少用继承。针对接口编程,不针对实现编程。为交互对象之间的松耦合设计而努力。你可以用无数个装饰者包装一个组件,而无需修改组件的代码。

Golang设计模式-装饰器模式

装饰器的实现方法:

  1. 设计一个接口Calculate,定义该接口的一些方法
  2. 申明一个基础对象结构体OriCalculate,实现这个接口
  3. 申明一个对象的结构体MutCalculate,实现这个接口并新增部分参数,同时更新了接口的方法
  4. 申明另一个对象结构体AddCalculate,实现这个接口并新增另外的参数,更新接口方法
  5. 初始化基础对象结构OriCalculate,并用这个基础对象结构去初始化装饰者MutCalculate和AddCalculate,分别实现不同的功能。

这样可以不用修改基础结构对象OriCalculate的代码,而通过调用共同实现接口的新的对象结构体实现了不同的功能。

Go语言借助于匿名组合和非入侵式接口可以很方便实现装饰模式。

decorator.go

package decorator

type Calculate interface {

    Cal() int

}

//创建一个基准struct,后面的装饰器给这个基准struct加功能

type OriCalculate struct {

    num int

}

func NewOriCalculate(num int)*OriCalculate{

    return &OriCalculate{num:num}

}

func (o *OriCalculate)Cal()  int{

    return o.num

}

//创建基于基准struct的乘法

type MutCalculate struct {

    Calculate

    num int

}

func NewMutCalculate(C Calculate,num int) *MutCalculate {

    return &MutCalculate{Calculate:C,num:num}

}

func (m *MutCalculate) Cal() int {

    return m.num*m.Calculate.Cal()

}

//创建基于基准struct的加法

type AddCalculate struct {

    Calculate

    num int

}

func NewAddCalculate(C Calculate,num int) *AddCalculate  {

    return &AddCalculate{Calculate:C,num:num}

}

func (a *AddCalculate)Cal()int  {

    return a.num+a.Calculate.Cal()

}

decorator_test.go

package decorator

import "log"

func ExampleDecorator() {

    //o:=NewOriCalculate(1)

    //定义的时候,接口实现的是指针接收,所以用指针初始化

    o:=&OriCalculate{1}

    m:=MutCalculate{o,2}

    a:=AddCalculate{o,3}

    log.Printf("Oricalculate is %d \n MutCalculate is %d\n AddCalculate is %d \n",o.Cal(),m.Cal(),a.Cal())

    // Output: The output of

    // this example.

}

在目录下执行go test,可自动执行ExampleObserver函数

最近发表
标签列表