程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 大話設計模式C++實現 -組合模式

大話設計模式C++實現 -組合模式

編輯:C++入門知識

大話設計模式C++實現 -組合模式


一、UML圖

\

 

二、概念

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

 

三、說明

角色:

(1)Component:為組合中的對象聲明接口,在適當情況下,實現所有類共有接口的默認行為。聲明一個接口用於訪問和管理Component 的子部件。

(2)Leaf:在組合中白哦是葉節點對象,葉節點沒有子節點。

(3)Composite:定義有枝節點行為,用來存儲子部件,在Component接口中實現與子部件有關的操作,比如增加Add和刪除Remove。

什麼時候使用組合模式?

當你發現需求中是體現部分與整體層次的結構時,以及你希望用戶可以忽略組合對象與單個對象的不同,統一地使用組合結構中的所有對象時,就應該考慮用組合模式了。

使用組合模式的好處?

(1)組合模式定義了包含基本對象(Leaf)和組合對象(Composite)的類層次結構。基本對象可以被組合成更復雜的組合對象,而這個組合對象又可以被組合,這樣不斷地地櫃下去,客戶代碼中,任何用到基本對象的地方都可以使用組合對象了。

(2)用戶不用關心到底是處理一個葉子節點還是處理一個組合組件,也就不用為定義組合而寫一些判斷語句了。

(3)簡而言之,組合模式讓客戶可以一致的使用組合結構和單個對象。

 

四、C++實現

(1)Composite.h

 

#ifndef COMPOSITE_H
#define COMPOSITE_H

#include 
#include 
#include 

//Component:此處為抽象公司類
class Company
{
protected:
	std::string name;
public:
	Company(std::string name)
	{
		this->name=name;
	}

	//增加節點
	virtual void Add(Company* c)=0;
	//刪除節點
	virtual void Remove(Company* c)=0;
	//展示
	virtual void Display(int depth)=0;
	//職責
	virtual void LineOfDuty()=0;

	//運算符重載
	inline bool operator==(const Company &company) const
	{
		return this->name==company.name;
	}
};

//Composite:具體公司類
class ConcreteCompany:public Company
{
private:
	std::list *children;
public:
	ConcreteCompany(std::string name):Company(name)
	{
		children=new std::list;
	}
	~ConcreteCompany()
	{
		for(std::list::iterator it=children->begin();it!=children->end();it++)
			delete *it;
		delete children;
	}
	//增加葉子節點
	void Add(Company* c)
	{
		children->push_back(c);
	}
	//刪除葉子節點
	void Remove(Company* c)
	{
		for(std::list::iterator it=children->begin();it!=children->end();it++)
		{
			if(**it==*c)
			{
				children->erase(it);
				break;
			}
		}
	}
	//打印
	void Display(int depth)
	{
		for(int i=0;i::iterator it=children->begin();it!=children->end();it++)
			(*it)->Display(depth+4);
	}
	//職責
	void LineOfDuty()
	{
		for(std::list::iterator it=children->begin();it!=children->end();it++)
			(*it)->LineOfDuty();
	}
};

//Leaf:人力資源部
class HRDepartment:public Company
{
public:
	HRDepartment(std::string name):Company(name){}

	void Add(Company* c){}
	void Remove(Company* c){}
	void Display(int depth)
	{
		for(int i=0;i

 

(2)Client.cpp

 

#include "Composite.h"
#include 
#include 
#include 

//Client,客戶端
void main()
{
	Company* root=new ConcreteCompany("北京總公司");
	root->Add(new HRDepartment("總公司人力資源部"));
	root->Add(new FinanceDepartment("總公司財務處"));

	Company* comp=new ConcreteCompany("上海華東分公司");
	comp->Add(new HRDepartment("華東分公司人力資源部"));
	comp->Add(new FinanceDepartment("華東分公司財務處"));

	root->Add(comp);

	Company* comp1=new ConcreteCompany("南京辦事處");
	comp1->Add(new HRDepartment("南京辦事處人力資源部"));
	comp1->Add(new FinanceDepartment("南京辦事處財務處"));

	comp->Add(comp1);

	Company* comp2=new ConcreteCompany("杭州辦事處");
	comp2->Add(new HRDepartment("杭州辦事處人力資源部"));
	comp2->Add(new FinanceDepartment("杭州辦事處財務處"));

	comp->Add(comp2);

	std::cout<<"結構圖:"<Display(1);

	std::cout<LineOfDuty();

	delete root;
	system("pause");
}


 

(3)運行截圖

\

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved