23种设计模式之(九)组合模式(python_c++实现)

《Python3案例和总结》-专栏介绍和目录 本专栏专注于Python基础和进阶的系统讲解,逐步深入实际应用场景到python高级特性,让你轻松学会用Python解决各种实际问题。不管是零基础还是有经验的开发,相信都能从本专栏获益。 阅读详情

23种设计模式之(九)组合模式(Composite)

本文主要介绍23种设计模式之组合模式,附详细python/c++示例代码。
- 概念
- 应用场景
- 注意事项
- 代码示例
- 总结
- 代码链接


组合模式(Composite)

概念

组合模式,是构造型的设计模式之一。通过递归手段依据树形结构来组合对象,用来表示部分以及整体层次,并可以通过一个对象来访问整个对象树,把一组相似的对象当作一个单一的对象

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

GoF对组合模式的定义是:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对单个对象和复合对象的使用具有一致性。

应用场景

(1)客户程序需要像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

(2)用户需要忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象(如树形菜单,文件、文件夹的管理)。

代码示例

C++代码示例

/************************************************************************/
/* 设计模式专题
/*
/* 组合模式
/*
/* Author  : zzl
/*
/* 编程环境: window10 vs2010
/*
/* Date    : 20180916
/************************************************************************/

#include <iostream>
#include "string"
#include "list"

class IFile
{
public:
    virtual void display() = 0;
    virtual int add(IFile *ifile) = 0;
    virtual int remove(IFile *ifile) = 0;
    virtual std::list<IFile *>* getChild() = 0;
};

//文件结点 
class File : public IFile
{
public:
    File(std::string name)
    {
        m_name = name;
    }
    virtual void display()
    {
        printf("%s\n",m_name.c_str());
    }

    virtual int add(IFile *ifile)
    {
        return -1;
    }

    virtual int remove(IFile *ifile)
    {
        return -1;
    }

    virtual std::list<IFile *>*  getChild()
    {
        return NULL;
    }
private:
    std::string m_name;
};

//目录 结点 
class Dir : public IFile
{
public:
    Dir(std::string name)
    {
        m_name = name;
        m_list = new std::list<IFile *>;
        m_list->clear();
    }
    virtual void display()
    {
        printf("%s\n",m_name.c_str());
    }

    virtual int add(IFile *ifile)
    {
        m_list->push_back(ifile);
        return 0;
    }

    virtual int remove(IFile *ifile)
    {
        m_list->remove(ifile);
        return 0;
    }

    virtual std::list<IFile *>*  getChild()
    {
        return m_list;
    }
private:
    std::string m_name;
    std::list<IFile *>  *m_list;
};


// 递归的显示树
void showTree(IFile *root, int level)
{
    int i = 0;
    if (root == NULL)
    {
        return ;
    }
    for (i=0; i<level; i++)
    {
        printf("\t");
    }
    //1 显示根 结点
    root->display();

    //2  若根结点 有孩子 
    //判读孩子是文件,显示名字 )
    //判断孩子是目录,showTree(子目录)

    std::list<IFile *>  *mylist = root->getChild();
    if (mylist != NULL) //说明是一个目录
    {
        for (std::list<IFile *>::iterator it=mylist->begin(); it!=mylist->end(); it++)
        {
            if ( (*it)->getChild() == NULL )
            {
                for (i=0; i<=level; i++) //注意 <= 
                {
                    printf("\t");
                }
                (*it)->display();
            }
            else
            {
                showTree(*it, level+1);
            }
        }
    }
}

void main()
{
    Dir *root = new Dir("C");
    //root->display();

    Dir *dir1 = new Dir("111dir");
    File *aaafile = new File("aaa.txt");

    //获取root结点下的 孩子集合
    std::list<IFile *>  *mylist =  root->getChild();

    root->add(dir1);
    root->add(aaafile);

    for ( std::list<IFile *>::iterator it=mylist->begin(); it!=mylist->end(); it++ )
    {
        (*it)->display();
    }


    Dir *dir222 = new Dir("222dir");
    File *bbbfile = new File("bbb.txt");
    dir1->add(dir222);
    dir1->add(bbbfile);

    printf("--------showTree---------\n");
    showTree(root, 0);

}

python代码示例

# -*- coding: utf-8 -*-
###################################################################
# 设计模式专题
# 
# 组合模式
# 
# Author  : zzl
# 
# 编程环境: window10 python2.7
# 
# Date    : 20180916
##################################################################

class IFile(object):
    def display(self):
        pass

    def add(self, ifile):
        pass

    def remove(self, ifile):
        pass

    def get_child(self):
        pass


# 文件结点
class File(IFile):
    def __init__(self, name):
        self.m_name = name

    def display(self):
        print(self.m_name)

    def add(self, ifile):
        return -1

    def remove(self, ifile):
        return -1

    def get_child(self):
        return None


# 目录结点
class Dir(IFile):
    def __init__(self, name):
        self.m_name = name
        self.m_list = []
        m_name = name

    def display(self):
        print(self.m_name)

    def add(self, ifile):
        self.m_list.append(ifile)

    def remove(self, ifile):
        self.m_list.remove(ifile)

    def get_child(self):
        return self.m_list


def show_tree(root, level):
    if not root:
        return
    for i in range(level):
        print "\t",#python2.7 打印不换行
    # 1、显示根结点
    root.display()
    # 2、若根结点有孩子
    # 判读孩子是文件, 显示名字
    # 判断孩子是目录, showTree(子目录)
    mylist = root.get_child()
    if mylist:  # 说明是一个目录
        for child in mylist:
            if not child.get_child():
                for i in range(level + 1):
                    print "\t",   #python2.7 打印不换行
                child.display()
            else:
                show_tree(child, level + 1)


if __name__ == "__main__":
    root = Dir("C")
    dir1 = Dir("111dir")
    aaafile = File("aaa.txt")

    # 获取root结点下的孩子集合
    mylist = root.get_child()
    root.add(dir1)
    root.add(aaafile)
    for child in mylist:
        child.display()

    dir222 = Dir("222dir")
    bbbfile = File("bbb.txt")
    dir1.add(dir222)
    dir1.add(bbbfile)

    print("--------showTree---------")
    show_tree(root, 0)


源码链接

设计模式(九)组合模式示例代码(python–c++)

实战Nocobase插件开发:如何用yarn pm命令快速创建和测试API接口插件 本文详细介绍了如何使用Nocobase插件开发工具快速创建和测试API接口插件,涵盖从环境配置、插件骨架生成到数据模型定义和接口实现的完整流程。通过yarn pm命令简化开发步骤,帮助开发者高效构建支持CRUD的API插件,适用于低代码平台开发场景。 阅读详情

相关推荐

【rk3566/3568】Android 11移植gms

【rk3566/3568】Android 11移植gms 1、前言 测试功能时,想去Google play store去下个应用测试,发现通过网页搜索总是下载不到正确的谷歌服务框架;于是就不得不去搞一个内置的gms。 2、移植 1、需要下载Android 11对应的gms的包 opengapps 2、看下文件目录 直接移植core里面的文件,GAPPs Optional按需添加 3、在vendor下创建google目录 ...

lin_ff的博客 7646

组合模式(Python版)

**容器节点(Composite)**:表示树中的容器节点,可以包含子节点,通常实现了管理子节点的操作。3. **透明性**:客户端可以通过统一的接口操作叶子节点和容器节点,不需要区分它们的具体类型。1. **统一接口**:组件类定义了统一的接口,使得叶子节点和容器节点可以被一致对待。3. **简化客户端代码**:客户端不需要区分叶子节点和容器节点,简化了客户端代码。2. **递归结构**:容器节点可以包含叶子节点和其他容器节点,形成递归结构。1. **灵活性**:可以简单地增加新的组件,扩展性强。

2401_82778412的博客 605

车载导航GPS欺骗

因此,如果我们能够模拟卫星信号,将模拟的信号通过信号发射装置发送给GPS传感器,那么就有可能实现欺骗GPS传感器获取虚假的位置信息,这种技术即SDR(软件无线电,Software Defined Radio)[2]。究其原因,在不使用时钟模块的条件下,HackRF发送信号的频率可能不十分精准,因此GPS传感器接收到信号之后可能无法正常解析GPS信号,因此时钟信号可能是HackRF进行GPS欺骗的关键。2)HackRF是否使用了时钟模块,时钟模块决定了信号发送频率的精准程度,对实验的成败也是至关重要的。

2503_90751789的博客 1324

【Python笔记-设计模式】组合模式

设计模式,Python语言描述,组合模式

木子家有小可爱的博客 1468

中国城市统计年鉴1991-2024面板数据真正无缺失值填补指标说明

大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。

yushibing717的博客 928

论文记录:Affine Formation Maneuver Control of Multiagent Systems

多智能体编队控制仿真记录 实现功能:平移/旋转/尺寸缩放/shear,见截图 注意:本仿真图只是起到了演示效果,中间过程速度产生突变,实际中是不允许的。需要进行速度规划,这一点论文中仿真图更为贴合实际。 参考论文:Zhao, S. (2018). Affine Formation Maneuver Control of Multiagent Systems. IEEE Transactions on Automatic Control, 63(12), 4140–4155. 突然发现有个博主写得很好,参考:

W1H1J1的博客 2108

结构拼图的艺术——组合模式(Python实现)

组合模式使得用户对单个对象和组合对象的使用具有一致性,简单来说,组合模式允许你将对象组合成树结构来表示“整体-部分”的层次结构,并且能够让用户像使用单个对象一样使用组合对象。通过今天的学习,希望大家能够更好地理解和应用组合模式,在实际项目中,不妨尝试使用组合模式,解决复杂的对象结构问题。今天,我们将介绍另一个非常实用的设计模式——组合模式,这个模式特别适合用于处理树形结构的问题,它能够让我们像处理单个对象一样来处理对象组合。我们将定义一个简单的文件系统,其中包含文件和文件夹,文件夹可以包含文件和子文件夹;

Asunqingwen的博客 829

【C++】【STL算法】数据窄化及代码安全性

本文系统探讨了C++工程中数据窄化(narrowing conversion)的隐患与解决方案。数据窄化指将高精度/大范围类型转换为低精度/小范围类型,虽语法合法但会导致静默精度损失。其危险性体现在:错误隐蔽、STL会放大问题、数值错误具有传播性。现代C++要求窄化必须显式声明,文中提出四种工程解决方案:显式转换、边界统一转换、范围检查转换和使用GSL工具。建议在系统边界集中处理窄化,保持计算链路类型一致性,并通过分层策略(建模用double,控制用float)确保数值稳定性。核心思想是让窄化成为清晰可控的

Double Galaxy 80

Python设计模式——组合模式

组合模式:将多个对象组合成为一个树状结构,来表示“部分-整体”的逻辑上的层次结构,组合模式使得用户对当个对象和组合对象的使用具有一致性

钟灵毓秀的博客 543

1分钟吃透一篇文献,借助AI辅助各部分精读,效率提升10倍(附AI提示词)

你现在是一名【研究领域】的资深博士,非常擅长阅读与分析长篇论文,那么接下来我会给你上传一篇论文,请你按照我的要求辅助我阅读。

qq_64378896的博客 640

华为od 面试八股文_JAVA语言_01_含答案

华为od 面试八股文_JAVA语言_01_含答案

MISAYAONE的博客 4311

浅谈Python设计模式 -- 组合模式

组合模式: 将对象组合成树形结构以表示“部分”和“整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 实例: 公司的层级关系。 代码实现: # 抽象一个组织类 class Component(object): def __init__(self, name): self.name = name def add(self,comp...

bocai_xiaodaidai的博客 739

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

23种设计模式教程目录

本教程系统性地介绍GoF(Gang of Four)提出的23种经典设计模式,从基础理论到实际应用,构建完整的设计模式知识体系。教程面向软件开发人员、架构师和计算机专业学生,通过理论讲解、代码实现、UML图解和实战案例,帮助读者深入理解和熟练运用设计模式。适用人群:学习收益:掌握设计模式基础理论,理解面向对象设计原则学习三大类设计模式,通过代码实践加深理解掌握复杂模式的应用场景和组合使用能够在实际项目中灵活运用设计模式解决复杂问题建议学习节奏:

wyl703的博客 993

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

组合模式_结构型_GOF23

组合模式

C/C++ 964

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【23种设计模式】模式背后运用的技术对照

本文详细介绍了软件设计中的三大类设计模式:结构型模式、创建型模式和行为型模式。结构型模式包括适配器、桥接、组合、装饰器、外观、享元和代理模式,用于处理类或对象之间的组合关系。创建型模式涵盖单例、工厂方法、抽象工厂、建造者和原型模式,专注于对象的创建机制。行为型模式涉及策略、模板方法、观察者、迭代器、责任链、命令、备忘录和状态模式,主要处理对象之间的职责分配和通信。每种模式都提供了技术要点和相关技术的应用示例,帮助开发者理解和应用这些设计模式以构建灵活、可维护的软件系统。

键盘爱好者 1368

GOF23设计模式之组合模式的理解

 使用组合模式的场景:      把部分和整体的关系用树形结构来表示,从而使客户端可以使用同一的方式处理部分对象和整体对象。      组合模式核心:      抽象构件(Component)角色:定义了叶子和容器构件的共同点。      叶子(Leaf)构件角色:无子节点      容器(Composite)构件角

不当初 709

【设计模式】Eric的学习笔记

设计模式学习笔记;

墨门 213

大话设计模式_设计模式Python版系列介绍:1、设计模式简介、类型、原则

今天开始准备写一个设计模式系列的Python版本,网上有很多Java、C++版本的,Python版本的相对来说比较零散,从今天开始,我会系统的介绍每个设计模式的Python实现。首先介绍一下什么是设计模式(Design Pattern):一句话解释一下:设计模式是面向对象编程时,如何定义类与类、类与对象、类与方法的各种组合方式的经验实践,都是前人的经验!通过在合适的场景下,选择合适的设计模式,对我...

weixin_39681644的博客 121

23种设计模式之(十)桥接模式(python_c++实现)

23种设计模式之(十)桥接模式(Bridge) 本文主要介绍23种设计模式之组合模式,附详细python/c++示例代码。 - 概念 - 应用场景 - 注意事项 - 代码示例 - 总结 - 代码链接 桥接模式(Bridge) 概念 桥接模式,是构造型的设计模式之一。Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的...

zzl_python的博客 335

设计模式 可复用面向对象软件的基础_设计模式导言【Python篇】

喜欢就关注我们吧!设计模式软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。从设计模式的定义就不难得出一个结论,设计模式是一个值得我们去深入学习并且掌握的东西。学习设计模式除了对我们的编码能力有提升外,也能够帮助我们在面试中脱...

weixin_39563132的博客 113

C/C++ 知识点-设计模式总结(C++和Python实现)

GoF的23种设计模式,包括创建型、结构型和行为型,其涵盖了面向对象思想的精髓以及诸多细节。本文结合《设计模式》和《大话设计模式》,并用C++和Python实现了《大话设计模式》中的23种模式案例。案例实现《大话设计模式》C++版《大话设计模式》Python版抽象工厂模式:提供一个创建一系列相关或互相依赖对象的接口,只需要知道对象的系列,无需知道具体的对象。在客户端中,具体工厂类只在初始化时出现一次,更改产品系列即可使用不同产品配置。...

m0_58687318的博客 367

《大话设计模式》Python 版代码实现

From:http://www.cnblogs.com/wuyuegb2312/archive/2013/04/09/3008320.html 一、简单工厂模式 模式特点:工厂根据条件产生不同功能的类。 程序实例:四则运算计算器,根据用户的输入产生相应的运算类,用这个运算类处理具体的运算。 代码特点:C/C++中的switch...case...分支使用字典的方...

freeking101的博客 3953

大话设计模式--Python

作者:五岳出处:http://www.cnblogs.com/wuyuegb2312 上一周把《大话设计模式》看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多、偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼界。《大话设计模式》的代码使用C#写成的,而在本人接触到的面向对象语言中,只对C++和Python还算了解,为了加深对各个模式的理解,我在网上下载了一个C++版的源代码,并...

weixin_30389003的博客 205

结构型设计模式解析:适配器、桥接等7种模式实战

结构型设计模式是面向对象编程中的核心概念,主要用于处理类与对象之间的组合关系。这类模式通过定义清晰的接口和层次结构,显著提升代码的可复用性和扩展性。其核心原理包括接口适配、功能扩展和结构简化等关键技术,在系统架构设计中具有重要价值。典型应用场景包括第三方库整合、跨平台开发、复杂系统封装等工程实践。适配器模式通过转换接口解决兼容性问题,桥接模式分离抽象与实现以应对多维度变化,而装饰器模式则实现了运行时功能的动态扩展。掌握这些模式能有效解决软件开发中的接口设计、系统解耦等常见挑战。

weixin_30786657的博客 316

生活中的设计模式——启程之前,请不要错过我

两年前优快云出一个产品叫ink,旨在提供一个高质量写作环境。那时就有写这一系列的想法了,而且也确实写了,就在ink里写了三篇文章,后来不知道因为什么原因这个产品下架了,我的三篇文章也没了,这事也就一直被我搁置下来,直到今天。今天,我想重新开始,以全新的方式和思路重写这一系列文章! 文章的特点:从生活的小故事开始,由浅入深,逐步阐述设计模式的思想,并抽象...

weixin_34301307的博客 199
上一篇: 23种设计模式之(八)适配器模式(python_c++实现)
下一篇: 23种设计模式之(十)桥接模式(python_c++实现)
zzl_python
博客等级 码龄8年 21粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值