设计模式利剑15-组合模式

定      义:将对象组合成树形结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性

优      点:

               1、高层模块调用简单

               2、节点自由增加

使用场景:

               1 .你想表示对象的部分 - 整体层次结构

               2 .你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

总结:组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以向处理简单元素一样来处理复杂元素

实际应用:

                先来看看组合模式的类图设计:

 

         1 Composite 模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化“一对一”的关系,使得客户代码可以一致地处理对象和对象容器,无需关心处理的是单个的对象,还是组合的对象容器。

         2 .将“客户代码与复杂的对象容器结构”解耦是 Composite 模式的核心思想,解耦之后,客户代码将与纯粹的抽象接口——而非对象容器的复内部实现结构——发生依赖关系,从而更能“应对变化”。

         3 Composite 模式中,是将“ Add Remove 等和对象容器相关的方法”定义在“表示抽象对象的 Component 类”中,还是将其定义在“表示对象容器的 Composite 类”中,是一个关乎“透明性”和“安全性”的两难问题,需要仔细权衡。这里有可能违背面向对象的“单一职责原则”,但是对于这种特殊结构,这又是必须付出的代价。 ASP.NET 控件的实现在这方面为我们提供了一个很好的示范。

         4 Composite 模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率

       来看一个例子,用程序来实现一个复杂的算术表达式的时候,将复杂的算术表达式可以拆分成简单的表达式,那么复杂的表达式与简单表达式组成了部分-整体的关系,也组合成一个树形结构,那么这种情况下,非常的适合用组合模式,例如(2+3)+(4*6),就可以组成一个树形结构。用UML描述如下:

 

                再来看看系统中的权限设置,是一个典型的树形结构,有很多操作方法,如从数据库中读取相关角色的权限初始化树形结构,再根据用户选择的权限获得树形结构权限,保存到数据库中,并且在选择父类节点的时候同时要选择所有的子类节点,取消也是,选择子类节点,自然要选中父类节点。在没有采用组合模式前,显示得很混乱,往往要加一个功能或者减少一个功能的工作量很复杂,采用组合模式以后,我可以将所有的权限数据都保存到数据库中,动态加载到页面,这样避免了每次调整一个权限都要重新编译系统,然后在客户端生成组合模式的树形结构,并定义每一个节点的操作方法,那么整个用户角色设置流程就显得非常的可扩展了。

     看看一个公司的组织架构图用组合模式来实现:

 

Public Class Corp Private _name As String Private _positon As String Private _salary As Integer Public Function getInfo() As String Dim info As String = "" info = "姓名:" & _name info = info & " 职位:" & Me._positon info = info & " 薪水:" & Me._salary Return info End Function ''' ''' ''' ''' Public Sub new(ByVal __name As String, ByVal __position As String, ByVal __salary As Integer) Me._name = __name Me._positon = __position Me._salary = __salary End Sub End Class ' Corp Public Class Branch Inherits Corp Private _branchArrayList As ArrayList = new ArrayList ''' ''' Public Sub addSubordinate(ByVal _corp As Corp) _branchArrayList.Add(_corp) End Sub Public Function getSubordinateInfo() As ArrayList Return _branchArrayList End Function ''' ''' ''' ''' Public Sub new(ByVal name As String, ByVal position As String, ByVal salary As Integer) MyBase.New(name, position, salary) End Sub End Class ' Branch Public Class Leaf Inherits Corp ''' ''' ''' ''' Public Sub new(ByVal name As String, ByVal position As String, ByVal salary As Integer) MyBase.New(name, position, salary) End Sub End Class ' Leaf

你可能感兴趣的:(设计模式,设计模式,string,integer,class,function,数据库)