1.概述
装饰器(Decorator)通过包装(不是继承)的方式向目标对象中动态地添加或删除功能。
1.1 说明
- Component(抽象组件):定义了原始对象的接口,装饰器也会实现这个接口。
- Concrete Component(具体组件):原始对象,以后装饰器会装饰它。
- Decorator(抽象装饰器):关联/聚合了抽象组件,并实现了抽象组件接口。
- Concrete Decorator(具体装饰器):继承或实现了抽象装饰器,负责向抽象组件添加新的功能。
1.2 类图
2.代码示例
2.1代码
package main
import "fmt"
// 定义一个抽象组件
type Component interface {
Get()
}
// 定义一个具体组件
type ConcreteComponent struct {
name string
}
// 具体组件有一个查看方法
func (c *ConcreteComponent) Get() {
fmt.Printf("%+v\n", c)
}
// 定义一个装饰器,它实现了抽象组件,同时它也关联了抽象组件
type Decorator struct {
Component Component
DecorationA string
DecorationB string
}
func (d *Decorator) Get() {
d.Component.Get()
fmt.Printf("实现装饰:%q,%q", d.DecorationA, d.DecorationB)
}
//创建一个具体装饰器A
type DecoratorA struct {
Decorator *Decorator
}
//Set模式扩展功能
func (d *DecoratorA) Set(decoration string) {
d.Decorator.DecorationA = decoration
}
//创建一个装饰器B
type DecoratorB struct {
Decorator *Decorator
//DecorationA string
}
//Set模式扩展功能
func (d DecoratorB) Set(decoration string) {
d.Decorator.DecorationB = decoration
}
func main() {
//已经有一个具体组件如下
concreteComponent := &ConcreteComponent{
name: "马户",
}
//下边用装饰器扩展一些功能
//实例化一个装饰器
decorator := &Decorator{
Component: concreteComponent,
}
//实例化具体装饰器A
decoratorA := DecoratorA{
Decorator: decorator,
}
//用装饰器A装饰
decoratorA.Set("两耳垂肩")
//实例化一个装饰器B
decoratorB := DecoratorB{
Decorator: decorator,
}
//用装饰器B装饰
decoratorB.Set("三孔鼻")
//查看结果
decorator.Get()
}
- 输出
&{name:马户}
实现装饰:"两耳垂肩","三孔鼻"
2.2 示例的类图
设计中,我们并没有一个抽象的装饰器,而是每个实际的装饰器都继承了worker;文章来源:https://www.toymoban.com/news/detail-704260.html
文章来源地址https://www.toymoban.com/news/detail-704260.html
到了这里,关于《golang设计模式》第二部分·结构型模式-04-装饰器模式(Decorator)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!