組合模式,是眾多的結構性模式中的一種,想比較之前的橋接模式以及適配器模式,在理解上會有稍稍的難度。
從組合模式的介紹上來看的話,其實還是不甚了解,以前學過的數據結構中的樹的概念到還能夠想起來一些。
從網上看到的一些關於這個模式的解釋,也都是一些沒有說到重要地方的解釋,看起來一大堆的東西,基本上沒有講清楚。既然如此麻煩,索性直接自己來通過代碼來理解還好點。
所謂的樹型結構和樹枝等等概念看起來也比較麻煩。但是從代碼上還是了解到了一些東西。所以就根據自己的所了解的程度進行類圖的繪制。
從上面可以知道,作為樹枝節點的部分雖然也是繼承根節點的,但是在使用上是屬於組合方式提供給樹枝節點使用。
相當於提供這樣一種情況,就是當一些對象進行組合使用和單獨的繼承都是我需要的情況下,才會采用這種模式。例如,在現在的娛樂公司裡面,往往會推出一些單獨的歌手,自然也會推出一些組合的歌手。而這樣的模式自然就是屬於組合模式了。雖然每個歌手不管是單獨的藝人還是組合中的任何一個,都是屬於歌手中的一個子類。但是,當公司進行調用的時候,往往這兩種情況是不同的,因為就需要推出一些組合和一些單獨演唱的歌手了。
從上面的例子,再舉一個實際的代碼示例吧。
[cpp]
<SPAN style="FONT-SIZE: 14px">#pragma once
#include"root.h"
//單飛歌手
class leaf:publicroot
{
public:
leaf(void);
~leaf(void);
public:
voidSinger();
};
#include "root.h"
#include <vector>
class compoment:publicroot
{
public:
compoment(void);
~compoment(void);
public:
voidSinger();
private:
std::vector<root*> psinger;
};
</SPAN>
#pragma once
#include"root.h"
//單飛歌手
class leaf:publicroot
{
public:
leaf(void);
~leaf(void);
public:
voidSinger();
};
#include "root.h"
#include <vector>
class compoment:publicroot
{
public:
compoment(void);
~compoment(void);
public:
voidSinger();
private:
std::vector<root*> psinger;
};
程序的運行結果如下。
這裡需要值得注意一個問題,在樹枝節點的上往往會有葉子節點,而葉子節點的調用方式正是以組合方式調用的。由於調用的方式正是以多個葉子節點一並調用的方式進行的,所以在調用葉子節點的時候,往往要做一些特殊處理的。
而且,這個調用方式在其他的模式中也是暫時沒有看到的,是這個模式的一種特殊的地方,整個組合模式而言,最需要特別注意的地方就是這裡了。
在上述的類圖中,樹枝節點對於根節點的調用就是一種組合方式,在實際操作中,就是通過成員變量的方式進行批量的操作。