C++设计模式-组合模式
生活随笔
收集整理的這篇文章主要介紹了
C++设计模式-组合模式
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
?
?
基本概念
代碼與實例
?
基本概念
個人感覺Qt的對象樹就是運用了這種設(shè)計模式!!!
當(dāng)然,只是個人感覺,本人并沒有研究Qt的源碼
組合模式(Composite):將對象組合成樹形結(jié)構(gòu)以表示‘部分-整體’的層次結(jié)構(gòu)。組合模式使得用戶對單個對象和組合對象的使用具有一致性。
何時使用:需求中提現(xiàn)部分和整體的層次結(jié)構(gòu),開發(fā)者希望用戶忽略組合對象與單個對象的不同,統(tǒng)一使用組合結(jié)構(gòu)中的所有對象時,就應(yīng)該考慮組合模式了!
組合模式讓客戶可以一致使用組合結(jié)構(gòu)的單個對象。
UML圖如下(此圖來至于 大話設(shè)計模式):
?
?
代碼與實例
程序運行截圖如下:
代碼如下:
Head.h
#ifndef HEAD_H #define HEAD_H#include <iostream> #include <string> #include <list> using namespace std;//公司類 接口 class Company{public:Company(const string &name);virtual ~Company();//增加-移除-顯示-旅行職責(zé)virtual void add(Company *c);virtual void remove(Company *c);virtual void display(int depath);virtual void lineOfDuty();protected:string m_name; };//具體公司類,實現(xiàn)接口 class Concretecompany: public Company{public:Concretecompany(const string &name);~Concretecompany();void add(Company *c);void remove(Company *c);void display(int depath);void lineOfDuty();private:list<Company*> m_children; };//人力資源部結(jié)點 class HRDepartment: public Company{public:HRDepartment(const string &name);~HRDepartment();void add(Company *c);void remove(Company *c);void display(int depath);void lineOfDuty(); };//財務(wù)部結(jié)點 class FinanceDepartment: public Company{public:FinanceDepartment(const string &name);~FinanceDepartment();void add(Company *c);void remove(Company *c);void display(int depath);void lineOfDuty(); };#endif //HEAD_HHead.cpp
#include "Head.h"Company::Company(const string &name) {this->m_name = name; }Company::~Company() {cout << "Company::~Company()" << endl; }void Company::add(Company *c) {}void Company::remove(Company *c) {}void Company::display(int depath) {}void Company::lineOfDuty() {}Concretecompany::Concretecompany(const string &name) : Company(name) {}Concretecompany::~Concretecompany() {cout << "Concretecompany::~Concretecompany()" << endl;for(list<Company*>::iterator it = m_children.begin(); it != m_children.end(); it++){delete *it;} }void Concretecompany::add(Company *c) {m_children.push_back(c); }void Concretecompany::remove(Company *c) {m_children.remove(c); }void Concretecompany::display(int depath) {for(int i = 0; i < depath; i++){cout << "-";}cout << m_name << endl;for(list<Company*>::iterator it = m_children.begin(); it != m_children.end(); it++){(*it)->display(depath + 2);} }void Concretecompany::lineOfDuty() {for(list<Company*>::iterator it = m_children.begin(); it != m_children.end(); it++){(*it)->lineOfDuty();} }HRDepartment::HRDepartment(const string &name) : Company(name) {}HRDepartment::~HRDepartment() {cout << "HRDepartment::~HRDepartment()" << endl; }void HRDepartment::add(Company *c) {}void HRDepartment::remove(Company *c) {}void HRDepartment::display(int depath) {for(int i = 0; i < depath; i++){cout << "-";}cout << m_name << endl; }void HRDepartment::lineOfDuty() {cout << m_name << "員工招聘培訓(xùn)管理" << endl; }FinanceDepartment::FinanceDepartment(const string &name) : Company(name) {}FinanceDepartment::~FinanceDepartment() {cout << "FinanceDepartment::~FinanceDepartment()" << endl; }void FinanceDepartment::add(Company *c) {}void FinanceDepartment::remove(Company *c) {}void FinanceDepartment::display(int depath) {for(int i = 0; i < depath; i++){cout << "-";}cout << m_name << endl; }void FinanceDepartment::lineOfDuty() {cout << m_name << "公司財務(wù)收支管理" << endl; }main.cpp
#include "Head.h"int main(int *argc, int *argv[]){Concretecompany *root = new Concretecompany("北京總公司");root->add(new HRDepartment("總公司人力資源部"));root->add(new FinanceDepartment("總公司財務(wù)部"));Concretecompany *comp = new Concretecompany("上海華東分公司");comp->add(new HRDepartment("華東分公司人力資源部"));comp->add(new FinanceDepartment("華東分公司財務(wù)部"));root->add(comp);Concretecompany *com1 = new Concretecompany("南京辦事處");com1->add(new HRDepartment("南京辦事處人力資源部"));com1->add(new FinanceDepartment("南京辦事處財務(wù)部"));comp->add(com1);Concretecompany *com2 = new Concretecompany("杭州辦事處");com2->add(new HRDepartment("杭州辦事處人力資源部"));com2->add(new FinanceDepartment("杭州辦事處財務(wù)部"));comp->add(com2);cout << "結(jié)構(gòu)圖:" << endl;root->display(1);cout << endl << "職責(zé):" << endl;root->lineOfDuty();cout << endl << "析構(gòu)了:" << endl;delete root;getchar();return 0; }?
總結(jié)
以上是生活随笔為你收集整理的C++设计模式-组合模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++|Java工作笔记-google
- 下一篇: Leaflet文档阅读笔记-Using