当前位置: 首页 > news >正文

Go语言设计模式(七)组合模式

组合模式是指将一组相似对象当做一个单一对象的设计模式.

1.组成角色:

1.1组件:

组合中的对象声明接口,主要用于访问和管理其子组件.

1.2叶子节点:

定义组合中原始对象行为的类.叶子节点表示组合中的叶对象.

1.3组合:

又称为容器,存储子组件并在组件接口中实现与子组件有关的类.

1.4客户端:

客户端可以通过组件接口操作组合中的对象.以及与树形结构中的所有项目交互.

2.使用场景:

2.1需要忽略组合对象和单个对象之间差异时.

2.2需要实现树形结构时.

2.3客户端以统一的方式处理简单或复杂的元素.

3.实现:

3.1组件接口:
// 组件接口
type Component interface {Execute()
}
3.2叶节点类:
// 叶子节点类
type Leaf struct {value int
}// 创建一个新的叶节点对象
func NewLeaf(value int) *Leaf {return &Leaf{value: value}
}// 打印叶节点的值
func (l *Leaf) Execute() {fmt.Println(l.value)
}
3.3组合类:
// 组合类
type Composite struct {children []Component
}// 创建一个新的组合对象
func NewComposite() *Composite {return &Composite{make([]Component, 0)}
}
3.4组合类中添加方法:
// 添加方法
func (c *Composite) Add(component Component) {c.children = append(c.children, component)
}func (c *Composite) Execute() {for _, child := range c.children {child.Execute()}
}
3.5客户端:
func main() {composite := itboStudy.NewComposite()leaf := itboStudy.NewLeaf(99)leaf1 := itboStudy.NewLeaf(88)leaf2 := itboStudy.NewLeaf(77)composite.Add(leaf)composite.Add(leaf1)composite.Add(leaf2)composite.Execute()
}

4.实战:

4.1叶子节点:
// 叶子节点类
type Files struct {Name string
}func (f *Files) Search(name string) {fmt.Printf("在文件%s中递归搜索%s", f.Name, name)
}func (f *Files) GetName() string {return f.Name
}
4.2组合类:
// 定义组合类.
type Folders struct {Compents []ComponentsName     string
}func (f *Folders) Search(name string) {fmt.Printf("在文件%s中递归搜索%s", f.Name, name)for i := range f.Compents {f.Compents[i].Search(name)}
}func (f *Folders) Add(c Components) {f.Compents = append(f.Compents, c)
}
4.3组件接口:
// 定义组件接口
type Components interface {Search(name string)
}
4.4客户端:
func main() {file1 := &itboStudy.Files{Name: "itboStudy1"}file2 := &itboStudy.Files{Name: "itboStudy2"}file3 := &itboStudy.Files{Name: "itboStudy3"}folders := &itboStudy.Folders{Name: "itboFolder"}folders.Add(file1)folders.Add(file2)folders.Add(file3)folders.Search("99")
}

5.优点:

无须了解构成树形结构的对象具体类,只需要调用接口方法.

客户端可以使用组件对象与复合结构中的对象进行交互.

如果调用的是叶子节点对象,可以直接处理请求.

如果调用的组合对象,组合模式会把请求转发给子组件.

6.缺点:

一旦定义了树结构,设计会过于笼统.

组合模式很难将树的组件限制为特定类型.

为了强制执行这种约束,程序必须依赖运行时检查.组合模式不能使用编程语言的类型系统.

士别三日当刮目相待.

http://www.dtcms.com/a/380365.html

相关文章:

  • 解密完全二叉树顺序存储之堆结构
  • 【Vue2 ✨】Vue2 入门之旅 · 进阶篇(三):模板编译原理
  • 嵌入式仿真技术在教学中的应用与挑战探析
  • Kaggle项目实践——Titanic: Machine Learning from Disaster
  • 【leetcode】127. 三角形的最小路径和
  • Java设计模式中的几种常用设计模式
  • 【Vue2 ✨】Vue2 入门之旅 · 进阶篇(四):异步更新与 nextTick 原理
  • 【小程序】微信小程序九宫格抽奖动画(完整版)
  • [BJDCTF 2020]encode
  • 系统核心解析:深入操作系统内部机制——进程管理与控制指南(一)【进程/PCB】
  • 速通ACM省铜第二天 赋源码(Adjacent XOR和Arboris Contractio)
  • Python快速入门专业版(二十四):while循环:条件循环与“死循环”避免(猜数字游戏案例)
  • 神经网络构成框架-理论学习
  • 智能眼镜产品成熟度分析框架与评估
  • 从零学算法2327
  • 【C++】:list容器全面解析
  • 渲染农场多少钱一小时
  • IDEA试用过期,无法登录,重置方法
  • IP验证学习之case编写
  • 通过Dockerfile构建Docker镜像并训练模型
  • 操作系统内核架构深度解析:从微内核到宏内核的设计哲学与性能权衡
  • IIS运行账户设置记录
  • 服务管理 systemctl
  • HTTP与HTTPS
  • devextreme-vue表格设置可复制粘贴
  • Go 语言 PDF 生成库综合比较与实践指南
  • 图技术重塑金融未来:悦数图数据库如何驱动行业创新与风控变革
  • 金融数据---ETF日线行情数据
  • Vue 整体框架全面解析
  • 鸿蒙 NEXT应用国际化:时区与夏令时处理