日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++设计模式-组合模式

發布時間:2025/3/15 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++设计模式-组合模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

?

基本概念

代碼與實例


?

基本概念

個人感覺Qt的對象樹就是運用了這種設計模式!!!

當然,只是個人感覺,本人并沒有研究Qt的源碼

組合模式(Composite):將對象組合成樹形結構以表示‘部分-整體’的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。

何時使用:需求中提現部分和整體的層次結構,開發者希望用戶忽略組合對象與單個對象的不同,統一使用組合結構中的所有對象時,就應該考慮組合模式了!

組合模式讓客戶可以一致使用組合結構的單個對象。

UML圖如下(此圖來至于 大話設計模式):

?

?

代碼與實例

程序運行截圖如下:

代碼如下:

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();//增加-移除-顯示-旅行職責virtual void add(Company *c);virtual void remove(Company *c);virtual void display(int depath);virtual void lineOfDuty();protected:string m_name; };//具體公司類,實現接口 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; };//人力資源部結點 class HRDepartment: public Company{public:HRDepartment(const string &name);~HRDepartment();void add(Company *c);void remove(Company *c);void display(int depath);void lineOfDuty(); };//財務部結點 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_H

Head.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 << "員工招聘培訓管理" << 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 << "公司財務收支管理" << endl; }

main.cpp

#include "Head.h"int main(int *argc, int *argv[]){Concretecompany *root = new Concretecompany("北京總公司");root->add(new HRDepartment("總公司人力資源部"));root->add(new FinanceDepartment("總公司財務部"));Concretecompany *comp = new Concretecompany("上海華東分公司");comp->add(new HRDepartment("華東分公司人力資源部"));comp->add(new FinanceDepartment("華東分公司財務部"));root->add(comp);Concretecompany *com1 = new Concretecompany("南京辦事處");com1->add(new HRDepartment("南京辦事處人力資源部"));com1->add(new FinanceDepartment("南京辦事處財務部"));comp->add(com1);Concretecompany *com2 = new Concretecompany("杭州辦事處");com2->add(new HRDepartment("杭州辦事處人力資源部"));com2->add(new FinanceDepartment("杭州辦事處財務部"));comp->add(com2);cout << "結構圖:" << endl;root->display(1);cout << endl << "職責:" << endl;root->lineOfDuty();cout << endl << "析構了:" << endl;delete root;getchar();return 0; }

?

總結

以上是生活随笔為你收集整理的C++设计模式-组合模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。