天天看点

Composite 组合对象结构型模式

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

      Composite 模式适用于:1)你想表示对象的“部分-整体”层次结构。2)你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

Composite 的通用结构图如下:

Composite 组合对象结构型模式

典型的 Composite 对象结构如下图所示:

Composite 组合对象结构型模式

注:1)客户通过 Component 接口操纵部件的对象。

     2)Component: 为组合中的对象声明接口;在适当的情况下,实现所有类共有接口的缺省行为;声明一个接口用于访问和管理 Component 的子组件。在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。

     3)Leaf:在组合中表示叶节点对象,叶节点没有子节点;在组合中定义对象行为。

     4):Composite:定义有子部件的那些部件的行为;存储子部件;在 Composite 接口中实现与子部件有关的操作。

        其中:Add 和 Remove 操作用于管理子部件。1):如果强调透明性,则应该在类层次结构的根部Component 定义子节点管理接口 ,这样可以一致地使用所有的组件,但这一方法是以安全性为代价的,因为客户有可能会做一些无意义的事情,例如在 Leaf 中增加或删除对象等。2):如果强调安全性,则在 Composite 类中定义管理子部件的方法,但这样损失了透明性,因为 Leaf 和 Composite 具有不同的接口。GOF 的书中指出,这一模式应该强调透明性。

Composite 组合对象结构型模式代码示例如下:

1:  //Composite.h      
2:  #pragma once      
3:         
4:  #include 
        
5:  #include 
        
6:         
7:  // 组合中的抽象基类      
8:  class Component{      
9:  public:      
10:      Component(){}      
11:      virtual ~Component(){    }      
12:         
13:      // 纯虚函数, 只提供接口, 没有默认的实现      
14:      virtual void Operation() = 0;      
15:         
16:      // 强调透明性,在层次结构的根部定义 Add 和 Remove 用于管理子部件      
17:      // 虚函数, 提供接口, 有默认的实现但是什么都不做      
18:      virtual void Add(Component* pChild);        //添加一个子组件      
19:      virtual void Remove(Component* pChild);        //删除一个子组件      
20:      virtual Component* GetChild(int nIndex);    //获得子组件的指针      
21:         
22:      // 当该结构中子类数目相对较少时,可以在基类中存放子类指针      
23:      // private:      
24:      // std::list
   
     m_ListOfComponent;
         
25:  };      
26:         
27:  // 派生自 Component, 是其中的叶子组件的基类      
28:  // Leaf1, for test      
29:  class Leaf1 : public Component{      
30:  public:      
31:      Leaf1(){}      
32:      virtual ~Leaf1(){    }      
33:         
34:      virtual void Operation();      
35:  };      
36:  // Leaf2, for test      
37:  class Leaf2 : public Component{      
38:  public:      
39:      Leaf2(){}      
40:      virtual ~Leaf2(){    }      
41:         
42:      virtual void Operation();      
43:  };      
44:         
45:  //      
46:  // Composite 派生自 Component, 是其中的含有子件的组件的基类      
47:  class Composite : public Component{      
48:  public:      
49:      Composite(){    }      
50:      virtual ~Composite();      
51:         
52:      // 对所有 m_ListOfComponent,调用其 Operation()      
53:      virtual void Operation();      
54:         
55:      virtual void Add(Component* pChild);      
56:      virtual void Remove(Component* pChild);      
57:      virtual Component* GetChild(int nIndex);      
58:         
59:  private:      
60:      // Composite 可以使用多种数据结构存贮它们的子节点      
61:      // 包括连接列表、树、数组和 hash 表。数据结构的选择取决于效率。      
62:      // 没有必要使用通用的数据结构,有时对于每个子节点, Composite       
63:      // 都有一个变量与之对应,这就要求 Composite 的每个子类都要实现自己的管理接口。      
64:         
65:      // 这里采用 list 容器去保存子组件      
66:      std::list
  
    m_ListOfComponent;
        
67:  };      
68:         
69:  // Derived from Composite, for test      
70:  class Leaf3 : public Composite{      
71:  public:      
72:      Leaf3(){}      
73:      virtual ~Leaf3(){    }      
74:         
75:      virtual void Operation();      
76:  };      
77:  // Derived from Composite, for test      
78:  class Leaf4 : public Composite{      
79:  public:      
80:      Leaf4(){}      
81:      virtual ~Leaf4(){    }      
82:         
83:      virtual void Operation();      
84:  };      
1:  // Composite.cpp      
2:  #include "Composite.h"      
3:  #include 
        
4:  #include 
        
5:         
6:  // Component成员函数的实现      
7:  void Component::Add(Component* pChild){}      
8:  void Component::Remove(Component* pChild){}      
9:  Component* Component::GetChild(int nIndex){ return NULL;}      
10:         
11:  // Leaf1 成员函数的实现, for test      
12:  void Leaf1::Operation(){      
13:      std::cout << "Operation by leaf1" << std::endl;      
14:  }      
15:  // Leaf2 成员函数的实现, for test      
16:  void Leaf2::Operation(){      
17:      std::cout << "Operation by leaf2" << std::endl;      
18:  }      
19:         
20:  // Composite 成员函数的实现      
21:  Composite::~Composite(){      
22:      std::list
  
   ::iterator iter1, iter2, temp;
        
23:         
24:      for (iter1  = m_ListOfComponent.begin(),       
25:          iter2 = m_ListOfComponent.end(); iter1 != iter2;)      
26:      {      
27:          temp = iter1;      
28:          ++iter1;      
29:          delete (*temp);      
30:      }          
31:      m_ListOfComponent.clear();      
32:  }          
33:         
34:  // Composite::Operation 对所有的      
35:  void Composite::Operation(){      
36:      //std::cout << "Operation by Composite" << std::endl;      
37:      std::list
  
   ::iterator iter1, iter2;
        
38:      for (iter1  = m_ListOfComponent.begin(),      
39:          iter2 = m_ListOfComponent.end();iter1 != iter2;++iter1)      
40:      {      
41:          (*iter1)->Operation();      
42:      }      
43:  }      
44:  // Add, Remove 管理子部件      
45:  void Composite::Add(Component* pChild){      
46:      m_ListOfComponent.push_back(pChild);      
47:  }      
48:         
49:  void Composite::Remove(Component* pChild){      
50:      std::list
  
   ::iterator iter;
        
51:         
52:      iter = find(m_ListOfComponent.begin(), m_ListOfComponent.end(), pChild);      
53:      if (m_ListOfComponent.end() != iter){      
54:          m_ListOfComponent.erase(iter);      
55:      }      
56:  }      
57:         
58:  Component* Composite::GetChild(int nIndex){      
59:      if (nIndex <= 0 || nIndex > m_ListOfComponent.size())      
60:          return NULL;      
61:         
62:      std::list
  
   ::iterator iter1, iter2;
        
63:      int i;      
64:      for (i = 1, iter1  = m_ListOfComponent.begin(),       
65:          iter2 = m_ListOfComponent.end();iter1 != iter2;++iter1, ++i){      
66:          if (i == nIndex)      
67:              break;      
68:      }      
69:         
70:      return *iter1;      
71:  }      
72:         
73:  // Leaf3 成员函数的实现, for test      
74:  void Leaf3::Operation(){      
75:      std::cout << "Operation by leaf3" << std::endl;      
76:  }      
77:  // Leaf4 成员函数的实现, for test      
78:  void Leaf4::Operation(){      
79:      std::cout << "Operation by leaf4" << std::endl;      
80:  }      
//test      
1:  //test.cpp      
2:  #include "Composite.h"      
3:  #include 
        
4:         
5:  int main()      
6:  {      
7:      Component* pComponent = new Composite;      
8:      Leaf1 *pLeaf1 = new Leaf1();      
9:      Leaf2 *pLeaf2 = new Leaf2();      
10:         
11:      Leaf3 *pLeaf3 = new Leaf3();      
12:      Leaf4 *pLeaf4 = new Leaf4();      
13:         
14:      pComponent->Add(pLeaf1);      
15:      pComponent->Add(pLeaf2);      
16:      pComponent->Add(pLeaf3);      
17:      pComponent->Add(pLeaf4);      
18:         
19:      pComponent->Operation();      
20:         
21:      delete pComponent;      
22:         
23:      return EXIT_SUCCESS;      
24:  }      

继续阅读