想不出组合模式优缺点,我觉得和一般的树形结构都差不多。
恩,不,还是有不同的,一般的二叉树和四叉树,他们的节点都是属于同一类型
一般的树
class Node
{
public:
Node* pParent;
std::list<node*> subNodeList;
};
组合模式:
class Component
{
public:
Add(Component* p);
ReMove(Componet *p);
protect:
std::list<Component*> subCList;
}
然而一部分派生类是有subNode,一部分派生类注定是没有subNode
例如,《大话设计模式》中的例子
一个总公司下面有财务部和分公司,分公司有财务部等。
他们都可以派生自component,但是总公司的财务部下面是没有子节点的。没有Add 和Remove方法。
是不是有点过度设计啊。
// 本来是要写组合模式的,仓促写个大概吧
// 先写一个三维中的普通的树型裁剪
// 场景中以一棵树来组织
// 树有子节点,每个树节点也有模型节点
// 随便写写的,没有运行,也没有参考,如有不当,请指出
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <vector>
using namespace std;
struct Point3d
{
double x;
double y;
double z;
};
class SpatialObject
{
public:
SpatialObject(){;}
virtual ~SpatialObject()
{
;
}
virtual void Cull() = 0;
protected:
virtual bool IsInFrustum(){ return true;}
Point3d m_Center;
double m_dRadius;
};
class SpatialMode : public SpatialObject
{
public:
~SpatialMode()
{
;
}
void Draw(){;}
void Cull()
{
if (IsInFrustum())
{
Draw();
}
}
};
class SpatialNode : public SpatialObject
{
public:
~SpatialNode()
{
// 删除节点中的模型
vector<SpatialMode*>::iterator modeIter = m_SubMode.begin();
for (; modeIter != m_SubMode.end(); ++ modeIter)
{
SpatialMode *pMode = static_cast<SpatialMode*>(*modeIter);
if (pMode)
{
delete pMode;
pMode = NULL;
}
}
m_SubMode.clear();
// 删除子节点
vector<SpatialNode*>::iterator nodeIter = m_SubNode.begin();
for (; nodeIter != m_SubNode.end(); ++nodeIter)
{
SpatialNode* pNode = static_cast<SpatialNode*>(*nodeIter);
if (pNode)
{
delete pNode;
pNode = NULL;
}
}
m_SubNode.clear();
}
void Cull()
{
vector<SpatialMode*>::iterator modeIter = m_SubMode.begin();
for (; modeIter != m_SubMode.end(); ++ modeIter)
{
SpatialMode *pMode = static_cast<SpatialMode*>(*modeIter);
pMode->Cull();
}
vector<SpatialNode*>::iterator nodeIter = m_SubNode.begin();
for (; nodeIter != m_SubNode.end(); ++nodeIter)
{
SpatialNode* pNode = static_cast<SpatialNode*>(*nodeIter);
pNode->Cull();
}
}
void AddSubNode(SpatialNode*){;}
void AddSubMode(SpatialMode*){;}
void RemoveSubNode(SpatialNode*){;}
void RemoveSubMode(SpatialMode*){;}
protected:
vector<SpatialNode*> m_SubNode;
vector<SpatialMode*> m_SubMode;
};
void ReadFile(IN const wstring& wstrFile, OUT SpatialMode* &pMode)
{
// 从文件中构建模型
;
}
void BuildTree(IN const vector<SpatialMode*>&, OUT SpatialNode* pRootNode)
{
// 根据模型集合构建树
// 中间会new SpatialNode
;
}
int _tmain(int argc, _TCHAR* argv[])
{
int k = 2;
vector<SpatialMode*> modeVec;
for (int i = 0; i < k; i ++)
{
SpatialMode *pMode = new SpatialMode;
ReadFile(L"filePath i", pMode);
modeVec.push_back(pMode);
}
SpatialObject* pRootNode = new SpatialNode();
BuildTree(modeVec, dynamic_cast<SpatialNode*>(pRootNode));
// 假设渲染一千帧吧
int frame = 0;
while(frame == 1000)
{
pRootNode->Cull();
frame ++;
}
// 析构
// 会调用子类的析构函数层层析构
if (pRootNode)
{
delete pRootNode;
pRootNode = NULL;
}
return 0;
}