設計模式:組合模式

dongyu2013發表於2014-03-27
組合模式:將物件組合成樹型結構以表示‘部分-整體’的層次結構。組合模式使使用者對單個物件和組合物件的使用具有一致性。

需求中體現部分和整體層次的結構時,已經你希望使用者可以忽略組合物件與單個物件的不同,統一使用組合結構中的所有物件時,就應該考慮使用組合模式


點選(此處)摺疊或開啟

  1. class Component{
  2. protected:
  3.     string name;
  4. public:
  5.     virtual void add( Component c);
  6.     virtual void remove( Component c);
  7.     virtual void Display( int depth);
  8. };

  9. class Leaf : public Component{
  10. public:
  11.     Leaf(string name):Component(name){}
  12.     void add(Component c){
  13.      cout<<\"Cannot add to a leaf\"<<endl;
  14.     }
  15.     void remove( Component c ){
  16.      cout<<\"Cannot remove from a leaf\"<<endl;
  17.     }
  18.     void Display( int depth )
  19.     {
  20.      cout<<new string(\'-\',depth)<<name<<endl;
  21.     }
  22. };

  23. class Composite : public Component{
  24. private:
  25.      list<Component> children = new list<Component>();
  26. public:
  27.     Composite(string name):Component(name) {}
  28.     void add(Component c){
  29.      children.add(c);
  30.     }
  31.     void remove( Component c ){
  32.      children.remove(c);
  33.     }
  34.     void Display( int depth )
  35.     {
  36.      cout<<new string(\'-\',depth)<<name<<endl;
  37.      for( Component component in children)
  38.      {
  39.      component.Display(depth+2);
  40.      }
  41.     }
  42. };

  43. void main()
  44. {
  45.     Composite root=new Composite(\"root\");
  46.     root.add(new leaf(\"Leaf A\"));
  47.     root.add(new leaf(\"Leaf B\"));

  48.     Composite comp=new Composite(\"Composit X\");
  49.     comp.add(new leaf(\"Leaf XA\"));
  50.     comp.add(new leaf(\"Leaf XB\"));

  51.     root.add(comp);

  52.     Composite comp2=new Composite(\"Composit XY\");
  53.     comp.add(new leaf(\"Leaf XYA\"));
  54.     comp.add(new leaf(\"Leaf XYB\"));

  55.     comp.add(comp2);

  56.     root.add(new leaf(\"leaf C\"));

  57.     leaf lef=new leaf(\"new leaf D\");
  58.     root.add(lef);
  59.     root.remove(lef);
  60. }

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29012686/viewspace-1131033/,如需轉載,請註明出處,否則將追究法律責任。

相關文章