Go 设计模式- 装饰器模式

简介: Go 设计模式- 装饰器模式

装饰模式使用对象组合的方式动态改变或增加对象行为。Go语言借助于匿名组合和非入侵式接口可以很方便实现装饰模式。使用匿名组合,在装饰器中不必显式定义转调原对象方法。


设计模式

image.png

装饰器模式

装饰器模式主要解决继承关系过于复杂的问题,通过组合来代替继承,给原始类添加增强功能,这也是判断装饰器的一个重要依据,除此之外,装饰器还有一个特点,可以对原始类嵌套使用多个装饰器,为了满足这样的需求,在设计的时候,装饰器类需要跟原始继承同步的抽象类或者接口。

Java IO 通过4个基类,扩展出很多子类, 具体如下:


image.png

装饰器模式相对于简单的组合关系,有如下特殊点:

  • 装饰器类和原始类继承相同的父类,我们可以对原始类嵌套多个装饰器类。
  • 装饰器类是对功能的增强,这也是装饰器模式应用场景的一个重要特点。

应用场景


  • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
  • 需要动态地给一个对象增加功能,这些功能也可以动态地被撤销。 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。

代码


package decorator
type Component interface {
 Calc() int
}
type ConcreteComponent struct{}
func (*ConcreteComponent) Calc() int {
 return 0
}
type MulDecorator struct {
 Component
 num int
}
func WarpMulDecorator(c Component, num int) Component {
 return &MulDecorator{
  Component: c,
  num:       num,
 }
}
func (d *MulDecorator) Calc() int {
 return d.Component.Calc() * d.num
}
type AddDecorator struct {
 Component
 num int
}
func WarpAddDecorator(c Component, num int) Component {
 return &AddDecorator{
  Component: c,
  num:       num,
 }
}
func (d *AddDecorator) Calc() int {
 return d.Component.Calc() + d.num
}

测试用例

package decorator
import (
 "fmt"
 "testing"
)
func TestExampleDecorator(t *testing.T) {
 var c Component = &ConcreteComponent{}
 c = WarpAddDecorator(c, 10)
 c = WarpMulDecorator(c, 8)
 res := c.Calc()
 fmt.Printf("res %d\n", res)
 // Output:
 // res 80
}

运行结果

=== RUN   TestExampleDecorator
res 80
--- PASS: TestExampleDecorator (0.00s)
PASS



相关文章
|
1月前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
33 0
|
6月前
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
63 1
|
2月前
|
设计模式 Java
Java设计模式-装饰器模式(10)
Java设计模式-装饰器模式(10)
|
3月前
|
设计模式 Go
go 设计模式之观察者模式
go 设计模式之观察者模式
|
4月前
|
设计模式 Go
Go语言设计模式:使用Option模式简化类的初始化
在Go语言中,面对构造函数参数过多导致的复杂性问题,可以采用Option模式。Option模式通过函数选项提供灵活的配置,增强了构造函数的可读性和可扩展性。以`Foo`为例,通过定义如`WithName`、`WithAge`、`WithDB`等设置器函数,调用者可以选择性地传递所需参数,避免了记忆参数顺序和类型。这种模式提升了代码的维护性和灵活性,特别是在处理多配置场景时。
72 8
|
5月前
|
设计模式 Java
Java设计模式:深入装饰器模式的三种写法(六)
Java设计模式:深入装饰器模式的三种写法(六)
|
5月前
|
设计模式 架构师 安全
设计模式第五讲-装饰器模式和代理模式详解
远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。例如,用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问虚拟硬盘时实际访问的是网盘空间。
268 0
|
6月前
|
设计模式 Go
[设计模式 Go实现] 结构型~享元模式
[设计模式 Go实现] 结构型~享元模式
|
6月前
|
设计模式 Go API
[设计模式 Go实现] 结构型~外观模式
[设计模式 Go实现] 结构型~外观模式
|
6月前
|
设计模式 Go
[设计模式 Go实现] 结构型~组合模式
[设计模式 Go实现] 结构型~组合模式