接下来4个模式是非常有趣的设计模式,同属于一个类型。
1. 情景与意图
举几个显示生活中的例子。
文件夹:没个文件夹都是具有相同属性的,但是文件夹又可以包含文件夹。每当我们打开文件夹的时候,可以一层一层二点打开。
公司人事架构:公司的某个领导,既是更高层领导的下属,却又是级别较低员工的领导。
在我们日常开发中,肯定也会遇到类似的情况。如何设计来达到这种数据结构呢?——组合模式。
2. 组合模式
将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 · 前面的例子可能还不够生动,我们直接上代码。
3. 公司人事架构
首先我们定义一下公司员工的属性。
class DPEmploye {
protected:
std::string _dpName;
std::string _dpDept;
std::string _dpRank;
public:
DPEmploye(const std::string& name, const std::string& dept, const std::string& rank);
virtual void showMessage() = 0;
};
下面将员工的属性和行为进行扩展,当然也可以直接写在上面的类,都是可以的。
class DPBasicEmploye : public DPEmploye {
// 下属
std::list<DPEmploye*> _employeList;
public:
DPBasicEmploye (const std::string& name, const std::string& dept, const std::string& rank);
void addSubordinate(DPEmploye& e);
void employeeTurnover(DPEmploye& e);
virtual void showMessage();
};
看一下具体的表现吧。
int main() {
DPBasicEmploye jia(std::string("jia Smith"), std::string("RD department"), std::string("T3"));
DPBasicEmploye yi(std::string("yi Jones"), std::string("RD department"), std::string("T3"));
DPBasicEmploye bing(std::string("bing Williams"), std::string("Marketing Department"), std::string("T3"));
DPBasicEmploye ding(std::string("ding Brown"), std::string("Marketing Department"), std::string("T3"));
DPBasicEmploye wu(std::string("wu Johnson"), std::string("RD department"), std::string("T6"));
wu.addSubordinate(jia);
wu.addSubordinate(yi);
DPBasicEmploye ji(std::string("ji Wilson"), std::string("Marketing Department"), std::string("T6"));
ji.addSubordinate(bing);
ji.addSubordinate(ding);
DPBasicEmploye geng(std::string("geng Garcia"), std::string("CEO"), std::string("T10"));
geng.addSubordinate(wu);
geng.addSubordinate(ji);
geng.showMessage();
ji.employeeTurnover(ding);
geng.showMessage();
return 0;
}
4. 总结
其实通过上面的代码可以很容易看到,组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
当然在上面的代码中还可以加一个指针,只想父节点,也就是指向领导,方便回溯遍历。
C++实现组合模式代码:【组合模式C++源码】
本文介绍了组合模式的概念,通过公司人事架构的例子展示了如何利用这种模式建立部分-整体的层次结构。组合模式允许用户对单个对象和组合对象进行一致的操作,属于结构型设计模式。代码示例中展示了如何创建员工类及其子类,实现树形结构的组织,并演示了添加、删除员工以及展示信息的功能。
282

被折叠的 条评论
为什么被折叠?



