设计模式之---组合模式
组合模式,是众多的结构性模式中的一种,想比较之前的桥接模式以及适配器模式,在理解上会有稍稍的难度。
从组合模式的介绍上来看的话,其实还是不甚了解,以前学过的数据结构中的树的概念到还能够想起来一些。
从网上看到的一些关于这个模式的解释,也都是一些没有说到重要地方的解释,看起来一大堆的东西,基本上没有讲清楚。既然如此麻烦,索性直接自己来通过代码来理解还好点。
所谓的树型结构和树枝等等概念看起来也比较麻烦。但是从代码上还是了解到了一些东西。所以就根据自己的所了解的程度进行类图的绘制。
从上面可以知道,作为树枝节点的部分虽然也是继承根节点的,但是在使用上是属于组合方式提供给树枝节点使用。
相当于提供这样一种情况,就是当一些对象进行组合使用和单独的继承都是我需要的情况下,才会采用这种模式。例如,在现在的娱乐公司里面,往往会推出一些单独的歌手,自然也会推出一些组合的歌手。而这样的模式自然就是属于组合模式了。虽然每个歌手不管是单独的艺人还是组合中的任何一个,都是属于歌手中的一个子类。但是,当公司进行调用的时候,往往这两种情况是不同的,因为就需要推出一些组合和一些单独演唱的歌手了。
从上面的例子,再举一个实际的代码示例吧。
[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;
};
程序的运行结果如下。
这里需要值得注意一个问题,在树枝节点的上往往会有叶子节点,而叶子节点的调用方式正是以组合方式调用的。由于调用的方式正是以多个叶子节点一并调用的方式进行的,所以在调用叶子节点的时候,往往要做一些特殊处理的。
而且,这个调用方式在其他的模式中也是暂时没有看到的,是这个模式的一种特殊的地方,整个组合模式而言,最需要特别注意的地方就是这里了。
在上述的类图中,树枝节点对于根节点的调用就是一种组合方式,在实际操作中,就是通过成员变量的方式进行批量的操作。
补充:软件开发 , C++ ,