Golang设计模式-装饰器模式

perfect6566 · · 299 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

装饰器模式

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

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

装饰器的实现方法:

  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函数


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:perfect6566

查看原文:Golang设计模式-装饰器模式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

299 次点击  
加入收藏 微博
下一篇:42. 接雨水
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传