大家好,我是每周都在这里陪大家的站长这一次,我们将继续学习设计模式这次我们要学的是组合模式这种模式平时在业务开发中并不常用,但对于处理一些特定的数据结构却是必不可少的

Go语言学习:组合,一个对数据结构算法和职场都有提升的设计模式

同时,了解组合模式的原理也有助于提高你的数据结构和算法,更重要的是可以让你明白一些职场道理具体原因是什么看完文章你就明白了

什么是组合模式。

组合模式也称为部分—整体模式其目的是通过同一个接口使客户对单个对象和组合对象的使用保持一致,属于结构化设计模式

应用场景

复合模式的使用要求业务场景中的实体可以表示为树结构通过复合模式将一组对象组织成树结构,客户端可以将单个对象和复合对象都视为树中的节点,以统一处理逻辑利用树结构的特点,将树和子树的处理转化为叶节点的递归处理,进而简化了代码实现

从上面的描述中,我们可以马上想到文件系统,公司组织架构等层级化的东西的操作会更适合应用组合模式。

组合模式的结构

组合模式由以下角色组成:

组件:组件是一个接口,它描述了由树中的单个对象和组合对象实现的操作。

叶节点:单个对象节点,这是树的基本结构它不包含子节点,因此无法将工作分配给下一个节点,叶节点最终将完成大部分实际工作

复合对象—包含子项目的一致性对象复合对象不知道其子项目所属的具体类,只通过通用组件接口与其子项目进行交互

客户端:通过组件接口与所有项目进行交互因此,客户端可以以同样的方式与树结构中的简单或复杂对象进行交互

组合模式的代码实现

我们用一个公司组织架构的例子来演示如何用代码实现组合模式。

我们都知道大公司的组织结构会很复杂,往往由集团公司—gt,分公司,每一级公司都有不同的部门,比如总公司有财务部,分公司也会有分支更传统一点在大的互联网公司里,可能会分为BG和BU,但是在展示层级上,都是一个意思

我们来看看这个例子,用Go语言的代码实现组合模式首先我们定义一个组织的行为界面,大到总公司,小到一个部门

//表示组织的接口类型organizationinterfacedisplayduty。

这里为了简单演示,界面中提供了两种方法,一种是打印你自己的组织结构职责的方法,另一种是显示组织职责的方法。接下来,定义并实现复合对象的行为:

复合对象用于表示拥有下属部门的组织正如您在代码中看到的,它保存了一个组织类型列表,其中存储了它的下属组织复合对象的显示和职责两种方法的实现是将工作委托给其下属组织,这也是复合模式的特点

接下来我们来看两个职能部门人力资源和财务部门的类型实现。

只要我们把组织结构的结构结合在客户端,无论有多少层组织,客户端对整个组织的调用都不会改变。

funcmainroot:= new composite organizationroot . addroot . add Compsh: =新的复合组织Compsh . addcompsh . add root.add compgd: =新的复合组织,2)compgd . add(amp,HRDOrgorgName:广东分公司人力资源部,深度:3)compgd . add(amp,Financeorgname:南京办事处财务部,深度:3) root添加(CompGD) FMTPrintln ( "公司组织结构:")root.displayfmt.Println( "各组织职责:")root.duty

我们在上一节中学习的组合模式和装饰模式在结构上非常相似我们来说说他们的区别

组合和装饰的区别

组合模式和装饰模式在结构上非常相似,并且具有非常相似的类结构但两者在使用意图上是有区别的

组合模式:为叶子对象和组合对象提供统一的接口,叶子对象分担组合对象要做的工作其实组合对象是送下一个工作,下面的工作做好之后,会返回(汇报)给上面的调用者,类似于公司里的那些组合

装饰者模式:装饰者属于大哥带小弟的类型核心的工作是弟弟做的,但是哥哥们会帮你做工作以外的事情比如你的导师,项目经理,领导在公司做的事情,就是为了强化你你可以理解他们是你的装修工

题外话,如果你的导师和领导没有强化你,那么在一开始,他们给你的评分比你面试的水平高了P7希望你进来后,可以一起奋斗,快速成长到了P7的水平,还不足以把事情做好你需要有系统思考的能力它的价值是什么你有没有制造壁垒来形成自己的核心竞争力你是否沉淀了一套可复用的物理数据和方法论

摘要

组合模式的优势主要包括以下两点。

通过实现树状结构,可以清楚地定义所有级别的复杂对象,表示对象的所有或部分级别。

简化客户端代码,使客户端忽略层次的差异,方便控制整个层次。

事实上,组合模式与其说是设计模式,不如说是业务场景的数据结构和算法的抽象场景中的数据可以表示为树形结构,业务需求的逻辑可以通过树的递归遍历算法来实现