使用组合模式可以使容器和内容具有一致性,可以将多个对象结合到一起,当成一个对象对待。
这里考虑文件和文件夹两个类,文件和文件夹都可以放在文件夹类中,因此定义一个虚接口CEntry,对文件夹和文件进行统一处理。
接口类:
1 #pragma once 2 class CEntry 3 { 4 public: 5 CEntry(); 6 virtual ~CEntry(); 7 8 virtual int GetSize(); 9 }; 10 11 #include "pch.h" 12 #include "Entry.h" 13 14 15 CEntry::CEntry() 16 { 17 } 18 19 20 CEntry::~CEntry() 21 { 22 } 23 24 int CEntry::GetSize() 25 { 26 return 0; 27 }
文件类:
1 #pragma once 2 #include "Entry.h" 3 class CFile : 4 public CEntry 5 { 6 public: 7 CFile(); 8 virtual ~CFile(); 9 10 void SetSize(int nSize); 11 virtual int GetSize(); 12 13 private: 14 int m_nSize; 15 }; 16 17 #include "pch.h" 18 #include "File.h" 19 20 21 CFile::CFile() 22 { 23 } 24 25 26 CFile::~CFile() 27 { 28 } 29 30 void CFile::SetSize(int nSize) 31 { 32 m_nSize = nSize; 33 } 34 35 int CFile::GetSize() 36 { 37 return m_nSize; 38 }
文件夹类:
#pragma once #include "Entry.h" #include <vector> class CDir : public CEntry { public: CDir(); virtual ~CDir(); virtual int GetSize(); void Add(CEntry* entry); private: std::vector<CEntry*> m_vecEntry; }; #include "pch.h" #include "Dir.h" CDir::CDir() { } CDir::~CDir() { } int CDir::GetSize() { int nSize = 0; for (int i = 0; i < m_vecEntry.size(); i++) { nSize += m_vecEntry[i]->GetSize(); } return nSize; } void CDir::Add(CEntry* entry) { m_vecEntry.push_back(entry); }
将文件放入文件夹中,而两者都继承至同一个虚接口就实现了多个对象的组合统一处理。