首页 > 其他分享 >golang实现设计模式之组合模式-优缺点与适用场景

golang实现设计模式之组合模式-优缺点与适用场景

时间:2023-06-09 18:24:28浏览次数:45  
标签:组合 keyword 对象 优缺点 Searching golang file 构件 设计模式

组合模式是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式。

结构

  • 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。(总的抽象类或接口,定义一些通用的方法,比如新增、删除)
  • 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于继承或实现抽象构件。
  • 树枝构件(Composite)角色 / 中间构件:是组合中的分支节点对象,它有子节点,用于继承和实现抽象构件。它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。

优缺点

  • 优点

1.使用与实现分离,客户端不用关注具体的组合方式,只关心使用。组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码
2.符合开闭原则。更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”。

  • 缺点

1.设计较复杂,客户端需要花更多时间理清类之间的层次关系。
2.不容易限制容器中的构件。
3.不容易用继承的方法来增加构件的新功能。

适用场景

  • 1.在需要表示一个对象整体与部分的层次结构的场合。
  • 2.要求对用户隐藏组合对象与单个对象的不同,用户可以用统一的接口使用组合结构中的所有对象的场合。

类型

  • 1.透明式。由于抽象构件声明了所有子类中的全部方法,所以客户端无须区别树叶对象和树枝对象,对客户端来说是透明的。但其缺点是:树叶构件本来没有 Add()、Remove() 及 GetChild() 方法,却要实现它们(空实现或抛异常),这样会带来一些安全性问题。
  • 2.安全式。将管理子构件的方法移到树枝构件中,抽象构件和树叶构件没有对子对象的管理方法,这样就避免了上一种方式的安全性问题,但由于叶子和分支有不同的接口,客户端在调用时要知道树叶对象和树枝对象的存在,所以失去了透明性。

代码实现

package main

import "fmt"

/*
业务场景:
- 在操作系统中的文件系统,我们可以区分文件夹和文件,文件夹又包含文件夹或文件,
  如我们需要在某个特定文件夹内的所有文件搜索某个关键词,就可以用到该模式。
 */

// 1.composite interface,声明方法,叶子节点和非叶子节点实现接口
// case中,文佳认为是叶子节点,文件夹是非叶子节点
type Component interface {
   Search(keyword string)
}

// 2.leaf node,叶子节点,不能向下递归
type File struct {
   Name string
}

func (r *File) Search(keyword string)  {
   fmt.Printf("Searching for keyword %s in file %s\n", keyword, r.Name)
}

func (r *File) GetName() string {
   return r.Name
}

// 3.component,可以包含叶子节点
type Folder struct {
   components []Component
   Name string
}

func (r *Folder) Search(keyword string)  {
   fmt.Printf("Searching for keyword %s in file %s\n", keyword, r.Name)
   for _, component := range r.components {
      component.Search(keyword)
   }
}

func (r *Folder) Add(c Component)  {
   r.components = append(r.components, c)
}

// 4.client
func main()  {
   // create 3 files
   file1 := &File{"file1"}
   file2 := &File{"file2"}
   file3 := &File{"file3"}

   // create 3 folders
   folder1 := &Folder{Name: "folder1"}
   folder2 := &Folder{Name: "folder2"}
   folder3 := &Folder{Name: "folder3"}

   // composite folder and file
   // folder1 as root
   folder1.Add(folder2)
   folder1.Add(folder3)
   folder2.Add(file1)
   folder2.Add(file2)
   folder3.Add(file3)

   // search keyword in root
   folder1.Search("hello")
   /*
   Searching for keyword hello in file folder1
   Searching for keyword hello in file folder2
   Searching for keyword hello in file file1
   Searching for keyword hello in file file2
   Searching for keyword hello in file folder3
   Searching for keyword hello in file file3
    */
}

参考文章:

标签:组合,keyword,对象,优缺点,Searching,golang,file,构件,设计模式
From: https://www.cnblogs.com/davis12/p/17469979.html

相关文章

  • golang实现设计模式之代理模式-优缺点,适用场景
    代理模式作为一种结构型的设计模式,因为某种原因,需要对访问的对象通过代理访问目标对象,访问对象不适合或者不能直接引用该目标对象,代理就成为访问对象和目标对象的中介。结构1.抽象主题(Subject)类。通过接口或抽象类声明真实主题和代理对象实现的业务方法。2.真实主题(RealSubje......
  • golang实现设计模式之责任链模式-优缺点,适用场景
    责任链模式是一种行为型的设计模式,也叫职责链,定义:在这样的场景中,请求需要经过一系列的处理者,通过列表或者链表将处理者组合起来,请求依次被处理者处理,如果需要中断,也可以及时退出处理。上述的这种的应用场景,典型的就是在web应用中的中间件或者拦截器,比如Gin框架的中间件。结......
  • golang实现设计模式之策略模式-优缺点,适用场景
    策略模式是一种行为型的设计模式,该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户,或者认为把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。结构1.抽象策略(Strategy)类。定义了一个公共接口,各种不......
  • golang实现设计模式之适配器模式-优缺点,适用场景
    适配器模式是一种结构型设计模式,它是通过接口转换,使得原先接口不被兼容的其他类可以一起工作。类型类结构型特点:-程序耦合性高-要求程序员对组件内部结构熟悉-应用相对少些类适配器模式可以用过继承的方式来实现。对象结构型特点:可重用性较差。对象适配器允许一......
  • golang实现设计模式之观察者模式-优缺点,适用场景
    观察者模式是一种行为型模式,其定义一种订阅机制,可在对象事件发生时通知多个“观察”该对象的其他对象。观察者模式常用订阅/发布机制,即发布者持有所有订阅者,当发布者状态变更或者特定行为时,通知所有订阅者。结构1.发布者。属性及行为:属性,订阅者列表,行为,添加、删除订阅者方......
  • golang实现设计模式之模板模式-优缺点,适用场景
    模板模式是一种行为型设计模式,其定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。特点1.算法结构已确定。2.具体实现交由子类实现。结构1.抽象类(AbstractClass)。算法步骤可以被声明为抽......
  • 基于网卡地址做设备指纹的优缺点
    生成设备指纹的目的是为了能唯一地标识设备,而且这个标识在设备的生命周期内保持稳定。因此,在选择设备特征时,通常需要考虑这些特征的唯一性和稳定性。软件及配置信息一版不适合,是因为这类变化虽然不大,但万一变化后,设备指纹会变,影响使用。比如:操作系统信息:操作系统版本、安装日......
  • 4月29日邓老师设计模式面试资料 一般有用 看1
    【金三银四】设计模式篇1.谈谈你对设计模式的理解1.首先谈设计模式的作用:经验的传承,提高了软件复用的水平,最终达到提高软件开发效率设计原则简单说明单一职责一个类只负责一项职责里氏替换原则子类可以扩展父类的功能,但不能改变父类原有的功能依赖倒置原则要依......
  • 9.3 模版设计模式
    抽象类的设计应该是比类更高一层的设计。抽象类最大好处:1.对子类方法对统一管理;2.可以自身提供有一些普通方法,并且这些普通方法可以调用抽象方法(这些抽象方法必须在有子类提供实现的时候才会生效)abstractclassAction{ //定义公共行为类 publicstaticfinal......
  • Golang 配置代理
    通过 goget 命令下载各种依赖时,经常需要访问github/google等网站。配置好代理后,可以快速稳定的访问。常用的go代理goproxyhttps://goproxy.io/zh/阿里云https://mirrors.aliyun.com/goproxy/七牛云https://goproxy.cn设置go代理go1.13及以上版本可以直接用下面......