设计模式(8) 组合模式(COMPOSITE)(二)

2014-11-24 02:55:14 · 作者: · 浏览: 1
aMKPGJyPgoKCjxocj4KPGJyPgoKtPrC68q+wP2jugq8xsvju/qjrNL0z+y78tXfxvuztbXXxczJ6LG409C63MP3z9S1xLK/t9Yt1fvM5bLjtM694bm5u/LV38jdxvey47TOveGhowrV4tbWveG5ubrc19TIu7XYyrnTw9fpus/Eo8q9vfjQ0LPpz/OhowrA4MnotqijugpFcXVpcG1lbnTJ+cP30rvQqbLZ1/e3tbvY0ru49snosbi1xMr00NQK19PA4M6q1ri2qLXEyeixuMq1z9bV4tCpstnX96OssPzAqLTFxczH/bavxvejrLyvs8m158K3o6y/qrnYtcRMZWFmwOChowpFcXVpcG1lbnS7ucn5w/fBy9K7uPZDcmVhdGVJdGVyYXRvcrLZ1/ejrLjDstnX986qt8POysv8tcTB47z+t7W72NK7uPZJdGVyYXRvcqGjCjxwcmUgY2xhc3M9"brush:java;">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 * CreateIterator(); protected: Equipment(const char*); private: const char* _name; };
磁盘驱动器(叶节点Leaf)
class FloppyDisk : public Equipment
{
public
    FloppyDisk(const char*);
    virtual ~FloppyDisk();

    virtual Watt Power();
    virtual Currency NetPrice();
    virtual Currency DiscountPrice();
};

CompositeEquipment为包含其他设备的基类,同时也是Equipment的子类。
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
       
        * CreateIterator();

protected:
    CompositeEquipment(const char*);
private:
    List
        
          _equipment; }; // CompositeEquipment为访问和管理子设备定义了一些操作 // 操作Add和Remove从存储在_equipment成员变量中的设备列表中插入并删除设备 // 操作CreateIterator返回一个迭代器遍历这个列表。 // NetPrice的缺省实现使用CreateIterator类累加子设备的实际价格。 Currency CompositeEquipment::NetPrice () { Iterator
         
          * i = CreateIterator(); Currency total = 0; for (i->First(); ~i->IsDone(); i->Next()) { total += i->CurrentItem()->NetPrice(); } delete i; return total; } // 现在我们将计算机的底盘表示为CompositeEquipment的子类Chassis class Chassis : public CompositeEquipment { public: Chassis(const char*); virtual ~Chassis(); virtual Watt Power(); virtual Currency NetPrice(); virtual Currency DiscountPrice(); }; 
         
        
       

类设定完毕,包括单个零件和一些包含若干零件的组合零件。下面就可以对计算机进行组装。
Cabinet* cabinet = new Cabinet("PC Cabinet");    // 机箱节点
Chassis* chassis = new Chassis("PC Cabinet");     // 主板节点

cabinet->Add(chassis);      // 将主板组装到机箱上去

Bus* bus = new Bus("MAC 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;



相关模式: 通常部件-父部件连接用于Responsibility of Chain模式 Decorator模式经常与Composite模式一起使用。 Flyweight模式让你共享 组件 Iterator模式可用来遍历Composite Visitor模式将本来应该分布在Composite和Leaf类中的操作和行为局部化。

参考资料: 《设计模式:可复用面向对象软件的基础》