`
xiaofengaini
  • 浏览: 8776 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式之组合模式

阅读更多
软件开发中应该注意的事情有两点:
1.多组合少继承
继承虽说能简化代码,提高一定的复用性,但是对与代码耦合度影响较大
2.多扩充少修改
因新需求扩充新功能,而少修改已经通过测试的程式码。

今天要介绍的就是组合模式,一种提供整体与部分的对照。这种理论很像树形,例如树中有树枝和树叶,树枝上有树叶,可以把树叶看做子节点
,那么树枝也可以看成一个节点,但是这个节点和叶子节点的不同之处在于,其有子节点。另一个例子就是,公司中各个部门和群组

然后处理相关商业需求逻辑,好比报表显示、读取资料...等,
大多Client端可能要先依输入资料取得相对应部门物件,
这里面可能也有部门群组的判断处理(如处别又是另一种商业逻辑),
而且部门群组的异动也将会造成Client端程式码频繁修改,
导致Client端的耦合性很高、不容易维护...等,
为了将Client程式码解耦,我们透过组合模式,将物件组合成为简单层次结构,
让Client端可以使用一致的方法来处理组合物件就像处理个别物件一样(将一对多改为一对一),
并且自己可以处理自己复杂的商业逻辑,
下面我们实际来看一下组合模式可以帮Client程式码带来什么样的改善。


需求:依照部门处理相关商业逻辑

大多数人可能会这样写Client端程式码
String [] Departments={"DepA" ,"DepB","DepC","DepAll"}
Factory defactory=new Factory();
for(String depart in Departments)
{
  IDepProcess mydep=depfactory.getDep(depart);
   if (mydep is DepartmentA ) //单部门
                 {
                     //读资料
                     mydep . Process();
                }
                else if (mydep is DepartmentB )
                {
                    //更新资料
                     mydep . Process();
                }
                else if (mydep is DepartmentC )
                {
                    //删除资料
                     mydep . Process();
                }
                else if (mydep is DepartmentGroup ) //部门群组
                 {
                     //处别的处理
                    //先确认各部门人数..等
                    mydep . Process();
                     List < IDepProcess > mydeps = (mydep as DepartmentGroup ) . GetDepartments();
                     foreach ( IDepProcess dep in mydeps)
                    {
                        //if(dep is DepartmentA)....
                        //Client继续处理相关判断
                    }
                }
            }


public class Factory
     {
         public Factory() { }

        public IDepProcess GetDep( string Department)
        {
            IDepProcess _IDepProcess = null ;
             switch (Department)
            {
                case "DepA" :
                    _IDepProcess = new DepartmentA ();
                     break ;
                 case "DepB" :
                    _IDepProcess = new DepartmentB ();
                     break ;
                 case "DepC" :
                    _IDepProcess = new DepartmentC ();
                     break ;
                 case "DepAll" :
                    _IDepProcess = new DepartmentGroup ();
                     break ;
                 default :
                    _IDepProcess = new DepartmentA ();
                     break ;           
            }
            return _IDepProcess;
        }   
    }
接口

public interface IDepProcess
     {
         void Process();      
    }

public class DepartmentA  extends  IDepProcess
     {

        #region IDepProcess成员

        public void Process()
        {
            System.out.println( "部门A处理" );
        }

        #endregion
     }

    public class DepartmentB extends IDepProcess
     {

        #region IDepProcess成员

        public void Process()
        {
             System.out.println( "部门B处理" );
        }

        #endregion
     }

    public class DepartmentC extends IDepProcess
     {

        #region IDepProcess成员

        public void Process()
        {
             System.out.println( "部门C处理" );
        }

        #endregion
     }

    public class DepartmentGroup extends IDepProcess
     {
         protected List < IDepProcess > departments = new List < IDepProcess > ();
         public List < IDepProcess > GetDepartments()
        {
          return departments;
        }

        #region IDepProcess成员

        public void Process()
        {
            System.out.println( "组合部门处理" );
        }

        #endregion
     }


接下来使用组合模式来重构Client程式码
            IDepProcess mydep = new DepartmentGroup ();
            mydep . Add( new DepartmentA ());
            mydep . Add( new DepartmentB ());
            mydep . Add( new DepartmentC ());
            mydep . Process();


修改组合模式中抽象接口,用处叶子节点和组合节点
     public interface IDepProcess
     {
         void Process();
         void Add( IDepProcess DepProcess);
         void Remove( IDepProcess DepProcess);
    }


为了要处理子物件逻辑,所以增加2各方法(Add、Remove)

其他类别修改如下
public class DepartmentA extends IDepProcess
     {

        #region IDepProcess成员

        public void Process()
        {
            System.out.println( "部门A处理" );
        } 

        public void Add( IDepProcess DepProcess)
        {
             throw new UnsupportedOperationException("对象不支持这个功能");;
        }

        public void Remove( IDepProcess DepProcess)
        {
             throw new UnsupportedOperationException("对象不支持这个功能");
        }

        #endregion
     }

Add 和Remove 对于没有子部门(最底层)类别来说没有任何意义,所以抛出自定义讯息。

群组类别修改如下
public class DepartmentGroup extends IDepProcess
     {    
         protected List < IDepProcess > departments = new List < IDepProcess > ();

        #region IDepProcess成员

        public void Add( IDepProcess DepProcess)
        {
            departments . Add(DepProcess);
        }

        public void Remove( IDepProcess DepProcess)
        {
            departments . Remove(DepProcess);
        }     

        public void Process()
        {
            System.out.println( "组合部门处理" );      
             if (departments . Count > 0 )
            {
                foreach ( IDepProcess dep in departments)
                {
                    dep . Process(); //可能是子部门或其他部门
                 }
            }
        }

        #endregion      
     }



从应用角度来看,如果你想把一对多的关系,转换为一对一的关系(一致性的行为),
那么你可以看到组合模式所带来的好处。
分享到:
评论

相关推荐

    设计模式之组合模式(Composite Pattern)

    组合模式是一种行为设计模式,属于面向对象设计中的结构型模式,其主要目的是为了建立一种对象树形结构,这种结构能够使客户端代码以统一的方式处理单个对象和对象的组合。在组合模式中,我们通常会定义一个基类,...

    c++-设计模式之组合模式(Composite Pattern)

    组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端可以以统一的方式对待单个对象和组合对象,这种模式常用于需要处理树形结构的数据...

    23钟设计模式之组合模式

    组合模式是一种设计模式,它允许我们使用树形结构来表示部分与整体的关系,使得我们可以将对象组织成树状层级结构,使得用户可以统一地处理单个对象和对象组合。这种模式在处理具有分层结构的数据时特别有用,例如...

    Java 23种设计模式12组合模式.pdf

    ### Java 23种设计模式之组合模式 #### 模式概述 组合模式是一种结构型设计模式,主要用于处理树形结构中的对象集合问题。通过这种模式,我们可以将多个对象组织成树形结构来表示“整体-部分”的层级关系,并允许...

    C++设计模式之组合模式(Composite)

    C++设计模式之组合模式(Composite) 组合模式(Composite)是一种结构型设计模式,用于描述分支包含关系,也就是我们说的树形关系。其对象分为枝和叶,每一枝可包含枝和叶,直到全部为叶节点。 组合模式的主要...

    设计模式_组合模式.zip

    这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。 我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的...

    pengjielee#blog.me#Javascript设计模式之组合模式1

    组合模式就是用小的对象来构建更大的对象,而这些小的对象本身也许是由更小的子对象构成的。var openDoorCommand = {var openWindow

    Python设计模式之组合模式原理与用法实例分析

    本文实例讲述了Python设计模式之组合模式原理与用法。分享给大家供大家参考,具体如下: 组合模式(Composite Pattern):将对象组合成成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象...

    JAVA设计模式之组合模式原理与用法详解

    JAVA设计模式之组合模式原理与用法详解 组合模式是JAVA设计模式的一种,主要用于处理树形结构的数据。它将不同但是相关的对象组合成树形结构,以实现“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用...

    PHP设计模式之组合模式定义与应用示例

    本文实例讲述了PHP设计模式之组合模式定义与应用。分享给大家供大家参考,具体如下: &lt;?php /** * 组合模式 * * 将对象组合成树形结构以表示部分-整体的层次结构,使得客户对单个对象和复合对象的使用具有一致...

    C++设计模式之组合模式

    在GOF的《设计模式:可复用面向对象软件的基础》一书中对组合模式是这样说的:将对象组合成树形结构以表示“部分-整体”的层次结构。组合(Composite)模式使得用户对单个对象和组合对象的使用具有一致性。 组合模式...

    设计模式之美——教你写出高质量代码

    "设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...

    c++设计模式-结构型模式-组合模式

    c++设计模式-结构型模式-组合模式;qt工程;c++简单源码; 组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系...

    设计模式之禅之+组合模式

    ### 设计模式之禅之组合模式 #### 一、引言 在面向对象的设计中,设计出既符合当前需求又能适应未来变化的软件系统是一项挑战。为了提高代码的复用性和系统的灵活性,开发者们总结出了多种设计模式。本文将探讨其中...

    java常用设计模式-组合模式

    java常用设计模式-组合模式 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。这种模式使得客户端可以统一对待单个对象和对象组合。在组合模式中...

Global site tag (gtag.js) - Google Analytics