结构型 组合模式

简介: 结构型 组合模式

组合模式(Composite Pattern):将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

组合模式:

逻辑分析:

组合模式包含以下主要角色。

  1. 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。
  2. 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口。
  3. 树枝构件(Composite)角色:是组合中的分支节点对象,它有子节点。它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。

定义一个抽象类,两个子类,一个作为树枝节点,一个作为树叶节点,树枝节点负责控制叶子节点

使用场景:

可以实现管理公司部门层级,人员管理的场景。

源码demo:

类似于树的节点依次管理,可以实现公司部门人员的管理。

/*************************************************************************
组合模式:
  是把单个对象和组合对象放在一起使用,把操作单个对象,和操作整个对象搞的没有太大差别
  在遍历的时候,如果存储的是叶子结点,那么调用叶子结点的显示函数
  如果存储的是组合对象,那么递归调用自己的显示函数
实现方式:
  定义单个对象和一组对象的接口,提供统一的操作函数
  在定义结点的时候,都将其创建出的对象,使用抽象类指针,指向这个创建的对象,
  然后将此指针,添加到相对应的结点。
***************************************************************************/
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Component
{
public:
  Component(string name){this->name = name;}
  virtual void add(Component *) = 0;
  virtual void remove(Component *) = 0;
  virtual void display(int) = 0;
public:
  string name;
};
class Leaf :public Component
{
public://子类继承父类,父类初始化要使用初始化列表
  Leaf(string name) :Component(name){}
  void add(Component *c)
  {   cout << "leaf cannot add" << endl;}
  void remove(Component *c)
  {  cout << "leaf cannot remove" << endl;  }
  void display(int depth)
  {
    string str(depth, '-');
    str += name;
    cout << str << endl;
  }
};
class Composite :public Component
{
private:
  vector<Component*> component;
public:
  Composite(string name) :Component(name){}
  void add(Component *c)
  {
    component.push_back(c);//容器操作,将其放入容器
  }
  void remove(Component *c)
  {
    for (vector<Component*>::iterator iter = component.begin(); iter != component.end(); iter++)
    {
      if (*iter == c)
      {
        component.erase(iter);
      }
      iter++;
    }
  }
  void display(int depth)
  {
    string str(depth, '-');
    str += name;//在调用打印的时候先将组合结点的名字打印出来
    cout << str << endl;//如果是组合结点直接打印
    for (vector<Component*>::iterator iter = component.begin(); iter != component.end(); iter++)
    {
      (*iter)->display(depth + 1);//如果是叶子结点,那么调用叶子结点的打印函数,将此-符号数量加1传递给叶子结点进行打印
    }         //每次多向下递归一层,就多向下遍历加1
  }
};
int main()
{
  Component *p = new Composite("小李");//组合结点Node中有一个vector向量
  p->add(new Leaf("小王"));//这里面存储的是叶子结点,所以调用叶子结点的Display函数
  p->add(new Leaf("小强"));
  Component *sub = new Composite("小虎");//在这里是把组合对象当成单个对象使用
  sub->add(new Leaf("小王"));  
  sub->add(new Leaf("小明"));   
  sub->add(new Leaf("小柳"));  
  p->add(sub);
  p->display(0);//在调用显示函数的时候,如果存储的是叶子结点,那么调用叶子结点的显示函数
   //如果存储的是组合结点,那么递归调用组合结点的显示函数
  sub->display(2);
  // system("pause");
  return 0;
}
目录
相关文章
|
缓存 监控 Linux
|
11月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
298 0
|
运维 监控 网络协议
IP 地址是什么,有什么用,通俗易懂答案?
**IP地址是互联网上设备的唯一标识,分为IPv4(32位,如192.168.1.1)和IPv6(128位,如2001:0db8:85a3:0000:0000:8a2e:0370:7334)。IP地址用于定位设备、数据包传递、网络安全和管理。分为公有(全球唯一)和私有(局域网内使用)IP,以及动态(DHCP分配)和静态(固定不变)IP。IP管理由ICANN和区域机构负责。了解IP地址基础知识对网络理解和故障排查至关重要。**
1624 3
|
机器学习/深度学习 数据采集 算法
数据挖掘实战 —— 抖音用户浏览行为数据分析与挖掘(二)
数据挖掘实战 —— 抖音用户浏览行为数据分析与挖掘(二)
817 1
|
应用服务中间件
首次用Intellij IDEA打开别人的项目,如何配置Tomcat服务器?
首次用Intellij IDEA打开别人的项目,如何配置Tomcat服务器?
首次用Intellij IDEA打开别人的项目,如何配置Tomcat服务器?
|
存储 自然语言处理 NoSQL
D7 Elasticsearch-Mongodb(搜索记录)
D7 Elasticsearch-Mongodb(搜索记录)
104 0
|
弹性计算 NoSQL 关系型数据库
天啊,谁来管管阿里云,2024这货又降价了!
天啊,谁来管管阿里云,2024这货又降价了!百款产品直降,平均降幅20%,阿里云希望通过此次大规模降价,让更多企业和开发者用上先进的公共云服务,加速云计算在中国各行各业的普及和发展。这次降价包括云服务器ECS、对象存储OSS、云数据库都降价了,真降价,直降价:百款产品直降,平均降幅20%,阿里云百科分享阿里云2024年降价信息汇总表
工程监测无线中继采集仪使用MODBUS协议来进行通信
MODBUS协议是一种工业通信协议,用于在工业自动化领域进行通信和数据交换。它是一种串行通信协议,可以用于多种不同的传输介质,如串口、以太网、无线电等。
工程监测无线中继采集仪使用MODBUS协议来进行通信