八、Composite(组成)
情景举例:
将对象组合成树形结构以表示“部分-整体”的层次结构。
代码示例:
/* 最关键的抽象类,涵盖了叶子与容器的接口 */ class Equipment { public: virtual ~Equipment(); const char* Name() { return _name; } /* */ virtual Watt Power(); virtual Currency NetPrice(); virtual Currency DiscountPrice(); /* */ virtual void Add(Equipment*); virtual void Remove(Equipment*); virtual Iterator<Equipment*>* CreateIterator(); protected: Equipment(const char*); private: const char* _name; }; /* 一个叶子的类接口 */ class FloppyDisk : public Equipment { public: FloppyDisk(const char*); virtual ~FloppyDisk(); /* */ virtual Watt Power(); virtual Currency NetPrice(); virtual Currency DiscountPrice(); }; /* 容器的接口,例子中其也是一个抽象类 */ class CompositeEquipment : public Equipment { public: virtual ~CompositeEquipment(); /* */ virtual Watt Power(); virtual Currency NetPrice(); virtual Currency DiscountPrice(); /* */ virtual void Add(Equipment*); virtual void Remove(Equipment*); virtual Iterator<Equipment*>* CreateIterator(); /* */ protected: CompositeEquipment(const char*); private: List<Equipment*> _equipment; }; /* 容器的实现使用了Iterator来遍历其子部件 */ Currency CompositeEquipment::NetPrice () { Iterator<Equipment*>* i = CreateIterator(); Currency total = 0; for (i->First(); !i->IsDone(); i->Next()) { total += i->CurrentItem()->NetPrice(); } delete i; return total; } /* 申明了几个具体类 */ class Chassis : public CompositeEquipment { public: Chassis(const char*); virtual ~Chassis(); /* */ virtual Watt Power(); virtual Currency NetPrice(); virtual Currency DiscountPrice(); }; /* */ class Cabinet : public CompositeEquipment { public: Cabinet(const char*); }; class Bus : public CompositeEquipment { public: Bus(const char*); }; class Card : public Equipment { public: Card(const char*); }; void dummy () { /* 在主程序中,这些容器与叶子以相同的行为被融合在一起 */ Cabinet* cabinet = new Cabinet("PC Cabinet"); Chassis* chassis = new Chassis("PC Chassis"); /* */ cabinet->Add(chassis); /* */ Bus* bus = new Bus("MCA Bus"); bus->Add(new Card("16Mbs Token Ring")); /* */ chassis->Add(bus); chassis->Add(new FloppyDisk("3.5in Floppy")); cout << "The net price is " << chassis->NetPrice() << endl;
个人理解:
组成模式最重要的是理解其类图与对象图的不同:叶子与容器在类图上处与同一层次,而在对象图中容器都是由容器或者叶子组成的。其模式的关键在于找到一个涵盖叶子与容器的抽象类(例子中的Equipment类)