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



相关文章
|
11月前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
98 0
|
7月前
|
设计模式 中间件 Java
设计模式3:代理、适配器、装饰器模式
代理模式是一种结构型设计模式,通过中间件解耦服务提供者和使用者,使使用者间接访问服务提供者,便于封装和控制。
118 3
|
9月前
|
设计模式 前端开发 JavaScript
前端必须掌握的设计模式——装饰器模式
装饰器模式是一种结构型设计模式,通过创建新类来包装原始对象,实现在不修改原有结构的前提下扩展新行为。其核心在于“组合”思想,使新功能可“即插即拔”。该模式具有解耦性、灵活性和动态性等特点,广泛应用于类的面向对象编程语言中,如JavaScript的注解和TypeScript的写法。示例中,通过装饰器模式为游戏角色动态添加装备,展示了其强大的扩展性和灵活性。
155 16
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
138 1
|
12月前
|
设计模式 Java
Java设计模式-装饰器模式(10)
Java设计模式-装饰器模式(10)
|
设计模式 Go
go 设计模式之观察者模式
go 设计模式之观察者模式
|
设计模式 Go
Go语言设计模式:使用Option模式简化类的初始化
在Go语言中,面对构造函数参数过多导致的复杂性问题,可以采用Option模式。Option模式通过函数选项提供灵活的配置,增强了构造函数的可读性和可扩展性。以`Foo`为例,通过定义如`WithName`、`WithAge`、`WithDB`等设置器函数,调用者可以选择性地传递所需参数,避免了记忆参数顺序和类型。这种模式提升了代码的维护性和灵活性,特别是在处理多配置场景时。
130 8
|
设计模式 Java
Java设计模式:深入装饰器模式的三种写法(六)
Java设计模式:深入装饰器模式的三种写法(六)
|
设计模式 Go
[设计模式 Go实现] 结构型~享元模式
[设计模式 Go实现] 结构型~享元模式
|
设计模式 Go API
[设计模式 Go实现] 结构型~外观模式
[设计模式 Go实现] 结构型~外观模式
119 2