设计模式学习笔记(九)——Composite组成

    技术2022-05-11  47

    八、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类)

     

    最新回复(0)