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

本文介绍组成模式的应用及其实现方式,通过示例代码展示了如何利用抽象类整合不同层级的对象,形成部分-整体的层次结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值