设计模式之 composite

AURIX™ TC3xx 调试口保护 secure debug AURIX™ TC3xx 调试口保护 secure debug UCB_DBG_ORIG and UCB_DBG_COPY Content 使用Debug Password 保护调试接口设置 项目硬件接口保护方案 hexview Lock using UDE Unlockusing UDE Lock using Lauterbach Unlock using Lauterbach 阅读详情

常见设计模式的解析和实现(C++)之八-Composite模式

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

UML结构图:


抽象基类:
1)Component:为组合中的对象声明接口,声明了类共有接口的缺省行为(如这里的Add,Remove,GetChild函数),声明一个接口函数可以访问Component的子组件.

接口函数:
1)Component::Operatation:定义了各个组件共有的行为接口,由各个组件的具体实现.
2)Component::Add添加一个子组件
3)Component::Remove::删除一个子组件.
4)Component::GetChild:获得子组件的指针.

解析:
Component模式是为解决组件之间的递归组合提供了解决的办法,它主要分为两个派生类,其中的Leaf是叶子结点,也就是不含有子组件的结点,而Composite是含有子组件的类.举一个例子来说明这个模式,在UI的设计中,最基本的控件是诸如Button,Edit这样的控件,相当于是这里的Leaf组件,而比较复杂的控件比如List则可也看做是由这些基本的组件组合起来的控件,相当于这里的Composite,它们之间有一些行为含义是相同的,比如在控件上作一个点击,移动操作等等的,这些都可以定义为抽象基类中的接口虚函数,由各个派生类去实现之,这些都会有的行为就是这里的Operation函数,而添加,删除等进行组件组合的操作只有非叶子结点才可能有,所以虚拟基类中只是提供接口而且默认的实现是什么都不做.

实现:
1)Composite.h
/********************************************************************
    created:    2006/07/20
    filename:     Composite.h
    author:        李创
                
http://www.cppblog.com/converse/

    purpose:    Composite模式的演示代码
********************************************************************
*/


#ifndef COMPOSITE_H
#define  COMPOSITE_H

#include 
< list >

//  组合中的抽象基类
class  Component
{
public:
    Component()
{}
    
virtual ~Component(){}

    
// 纯虚函数,只提供接口,没有默认的实现
    virtual void Operation() = 0;

    
// 虚函数,提供接口,有默认的实现就是什么都不做
    virtual void Add(Component* pChild);
    
virtual void Remove(Component* pChild);
    
virtual Component* GetChild(int nIndex);
}
;

//  派生自Component,是其中的叶子组件的基类
class  Leaf
    : 
public  Component
{
public:
    Leaf()
{}
    
virtual ~Leaf(){}

    
virtual void Operation();
}
;

//  派生自Component,是其中的含有子件的组件的基类
class  Composite
    : 
public  Component
{
public:
    Composite()
{}
    
virtual ~Composite();

    
virtual void Operation();

    
virtual void Add(Component* pChild);
    
virtual void Remove(Component* pChild);
    
virtual Component* GetChild(int nIndex);

private:
    
// 采用list容器去保存子组件
    std::list<Component*>    m_ListOfComponent;
}
;

#endif

2)Composite.cpp
/********************************************************************
    created:    2006/07/20
    filename:     Composite.cpp
    author:        李创
                
http://www.cppblog.com/converse/

    purpose:    Composite模式的演示代码
********************************************************************
*/


#include 
" Composite.h "
#include 
< iostream >
#include 
< algorithm >

/*-------------------------------------------------------------------
    Component成员函数的实现

 -------------------------------------------------------------------
*/

void  Component::Add(Component *  pChild)
{

}


void  Component::Remove(Component *  pChild)
{

}


Component
*  Component::GetChild( int  nIndex)
{
    
return NULL;
}


/*-------------------------------------------------------------------
    Leaf成员函数的实现

-------------------------------------------------------------------
*/

void  Leaf::Operation()
{
    std::cout 
<< "Operation by leaf/n";
}


/*-------------------------------------------------------------------
    Composite成员函数的实现

-------------------------------------------------------------------
*/

Composite::
~ Composite()
{
    std::list
<Component*>::iterator iter1, iter2, temp;

    
for (iter1  = m_ListOfComponent.begin(), iter2 = m_ListOfComponent.end();
         iter1 
!= iter2;
         )
    
{
        temp 
= iter1;
        
++iter1;
        delete (
*temp);
    }

}


void  Composite::Add(Component *  pChild)
{
    m_ListOfComponent.push_back(pChild);
}


void  Composite::Remove(Component *  pChild)
{
    std::list
<Component*>::iterator iter;

    iter 
= find(m_ListOfComponent.begin(), m_ListOfComponent.end(), pChild);

    
if (m_ListOfComponent.end() != iter)
    
{
        m_ListOfComponent.erase(iter);
    }

}


Component
*  Composite::GetChild( int  nIndex)
{
    
if (nIndex <= 0 || nIndex > m_ListOfComponent.size())
        
return NULL;

    std::list
<Component*>::iterator iter1, iter2;
    
int i;
    
for (i = 1, iter1  = m_ListOfComponent.begin(), iter2 = m_ListOfComponent.end();
        iter1 
!= iter2;
        
++iter1, ++i)
    
{
        
if (i == nIndex)
            
break;
    }


    
return *iter1;
}


void  Composite::Operation()
{
    std::cout 
<< "Operation by Composite/n";

    std::list
<Component*>::iterator iter1, iter2;

    
for (iter1  = m_ListOfComponent.begin(), iter2 = m_ListOfComponent.end();
        iter1 
!= iter2;
        
++iter1)
    
{
        (
*iter1)->Operation();
    }

}

3)Main.cpp

/********************************************************************
    created:    2006/07/20
    filename:     Main.cpp
    author:        李创
                
http://www.cppblog.com/converse/

    purpose:    Composite模式的测试代码
********************************************************************
*/


#include 
"Composite.h"
#include 
<stdlib.h>

int main()
{
    Leaf 
*pLeaf1 = new Leaf();
    Leaf 
*pLeaf2 = new Leaf();

    Composite
* pComposite = new Composite;
    pComposite
->Add(pLeaf1);
    pComposite
->Add(pLeaf2);
    pComposite
->Operation();
    pComposite
->GetChild(2)->Operation();

    delete pComposite;

    system(
"pause");

    
return 0;
}

转载自:http://www.cppblog.com/converse/archive/2006/07/24/10383.html

构成一个树形的整体结构,整体包含个体,嵌套包含。容器包含组件。叶子组件只能做操作,容器组件可以嵌套叶子组件。

ANFIS实现数据非线性回归附Matlab代码 在本文中,我们将介绍如何使用Matlab实现基于MSE的ANFIS非线性回归,并提供相应的源代码。ANFIS是一种融合了模糊逻辑和神经网络的方法,它可以通过学习数据集中的模式来构建一个模糊推理系统。ANFIS的训练过程基于最小化MSE,以提高模型的拟合能力。通过上述代码示例,我们可以使用基于MSE的ANFIS模型对数据进行非线性回归,并获得相应的预测结果。在示例中,我们定义了一个包含两个样本的新输入数据集 X_new,然后使用训练好的ANFIS模型进行预测,并将结果存储在变量 Y_pred 中。 阅读详情

相关推荐

Codex CLI 接入智谱 GLM-5.1 完整教程

Codex CLI 是 OpenAI 推出的命令行 AI 编程工具,支持自主读取文件、执行命令、编写代码等操作,是目前最火的终端 AI 编程工具之一。通过 CLIProxyAPI 代理,我们成功将 Codex CLI 与智谱 GLM-5.1 模型对接,核心在于解决 Responses API 与 Chat Completions API 的协议转换问题。✅成熟稳定:CLIProxyAPI 社区活跃(4.7k fork),持续维护✅完整兼容:支持流式/非流式、function calling✅低成本。

u011831527的博客 2573

【设计模式】Composite

目录前言安卓View的实现ViewBeyond setContentViewsetContentView做了什么事情?如何将xml文件变成对象的?小结View的绘制流程三个流程三个过程如何触发MeasureLayoutDrawComposite设计模式measure, layout, draw的调用总结参考链接 前言 Composite设计模式,将物体组合成一个树结构,让单个对象和组合对象使用起来都一样,组合对象负责将实际的操作分发给每一个组件。 这篇博文分析了安卓的View相关的类,它们可以说是...

gman344的博客 590

STM32CubeIDE无法连接STLinkV2的一个可能原因

前些日子买了个新的STLINKV2 , ( 老的被我家猫猫一泡尿送上西天了)刚开始还挺正常的, 后来有一天就突然间发现无法调试了.网上尝试了各种方法, 各种操作. 百度了好久. 最后好在我自己研究出来了.我使用的是 STM32CubeIDE 这个开发工具调试选项如下图其它的不需要修改, 然后点击下面的apply 按钮, 然后调试Debug, 提示 No STLink 如下图后来尝试了下载ST-LINK Utility 用它是可以正常连接STLink的, 然后也能正常进行升级操作.

走错路的程序员 9828

设计模式之 Composite(组合)通俗理解

1 Composite 模式定义 将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。 Composite 比较容易理解,想到 Composite 就应该想到树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite 将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。 所以 Composite 模式使用到 Iterator 模式,和 Chain of Res

码灵的博客 874

MIMIC数据库基本信息分析

一、MIMIC数据库中26张表介绍 数据库中一共有26张表,记录患者入院的各种信息,每张表的介绍如下所示。 表格名 信息 admission 患者基本信息,比如性别、种族、语言、宗教、婚姻、入院和出院时间、死亡时间等 callout 提供病人准备从ICU转出或者已经从ICU转出时相关信息 caregivers 记录医护人员信息(ID、类型、附加...

m0_37520426的博客 1万+

带你一分钟了解电感与磁珠的区别

在电路设计中会经常使用到电感和磁珠,虽然在电路中的作用有所不同,但它们都属于磁性电子元器件,本文简单介绍下电感和磁珠的区别电感和磁珠电感和磁珠的结构主要由磁性材料金属线圈和外壳组成,具体结构如下图所示:电感磁珠结构图电感其实是金属线圈缠绕在磁芯上,而磁珠是在内部折叠后外围包裹着铁氧体磁性材料。电感器(Inductor)又称扼流器、电抗器、动态电抗器是储能器件,能够把电能转化为磁能而存储起来的元件。磁珠则是能量转换(消耗)器件,将流过他的高频信号以热能的形式消耗掉。

攻城狮鹏哥 1409

设计模式---Composite

Composite Pattern 组合模式(Composite Design Pattern)主要功能是能够使客户端(Client Code) 平等的对待单一组件(Single Componets)和容器组件(Container Componen)。从而实现客户端代码与组件之间的解耦。 适用场景 Composites that contain Components, each of which could be a Composite. 组合中包含组件,每个组件有可能也是一个组合。 解决问题 ..

菜鸟专栏 230

一文搞懂 RC Correlation Scale Factor 的生成与应用

pre-route 用的是统计估算模型,post-route 用的是详细布线提取,signoff 用的是第三方 QRC 或 StarRC——三个工具,三套参数体系,结果自然天差地别。不同 RC corner(rc_worst/rc_best/rc_typical)对应不同的工艺角和温度环境,每个 corner 的 R/C 偏差比例不同,必须分别生成和应用各自的 scale factor。别被名字骗了,这个工具专门干一件事——统计拟合两组 SPEF 之间的偏差,自动推荐最优 scaling factor。

weixin_47770727的博客 554

设计模式---合成模式(DesignPattern_Composite)

摘录自:设计模式与游戏完美开发 十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合...

su9257的博客 111

Prism 入门02,区域介绍

什么是区域(Region)?区域,在Prism 框架中,区域是模块化的核心的功能之一,其主要作用是降低应用程序和模块之间的耦合度。使用方式:在应用程序的界面中,划分出某块区域,并为这个区域定义一个唯一的区域名称。那么通过这个区域名称,应用程序就可以找到指定的区域。并为这个区域动态放置一些容器或控件,从而呈现在界面中。

build2024 1126

《RT-Thread入门与实战》第1章:RT-Thread概述与核心优势

2006年由熊谱翔发起2017年成立上海睿赛德电子科技公司2021年成为国内首个通过ISO 26262 ASIL-D认证的RTOS。

2301_79143213的博客 985

设计模式Composite

Edidaughter的博客 229

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Composite Design Pattern 组合设计模式

组合设计模式,就是可以把多个类组合在一个大类中,形成一个树形结构。 #include #include #include using namespace std; class Coporate { protected: string name; set coporate; public: explicit Coporate(string n = "", string d

靖空间 1542

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

composite java,java设计模式_Composite模式

Composite模式(组合)Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Composite(组合模式)模式是比较常用的一个模式.Composite组合模式,将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客...

weixin_34805229的博客 192

图解设计模式之Composite模式

composite模式,组合模式

weixin_45820190的博客 400

图解设计模式-Composite模式

图解设计模式-Composite模式

localhost 466

设计模式—Composite模式

 设计模式—Composite模式 将对象组合成树形结构以表示“整体—部分”的层次结构。Composite模式使单个对象和组合对象的使用具有一致性。 <!--google_ad_client = "pub-5977682010997732";/* 336x280, 创建于 08-7

EagleYIN417的专栏 2276

javascript的设计模式实现05之Composite

Composite模式参考图片: 代码: var Iterator = function() {}; Iterator.prototype.first = function(){}; Iterator.prototype.next = function(){}; Iterator.prototype.isDone = function(){}; Iterator.prototype.c

stevenq2012的专栏 448

设计模式:组合模式(Composite)

设计模式:组合模式(Composite)

ProgramNovice的博客 1195

设计模式之Composite(组合)

Composite模式定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.Composite比较容易理解,想到Composite就应该想到树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形

Intraweb的专栏 740

C++设计模式之Composite

C++设计模式之Composite   2002-08-06· · ··COM集中营  一、功能    表示“部分-整体”关系,并使用户以一致的方式使用单个对象和组合对象。   二、结构图   上图中,也可以做些扩展,根据需要可以将Leaf和Composite做为抽象基类,从中派生出子类来。   三、优缺点   优

239

[DesignPattern] 组合 Composite

使用目的:          让使用它的人认为它们是同一个类别的物件 例子:          档案系统(树状图),如下图的UML所画的(图的来源是随便找的),File、Directory都是继承于Entry, 外面的人只需要操作Entry就能同时使用不同类别的物件,File与Directory针对各自的特性去实作它们的方法, 而不是Entry,不过若是共有属性,就可以直接在Entry里

学习杂记 576

如何彻底搞懂组合(Composite)设计模式?

结合组合设计模式的基本结构图,可以认为 SqlNode 相当于是Component接口,MixedSqlNode 相当于是Composite组件,而其它SqlNode的子类则是Leaf组件,最后DynamicSqlSource则是整个模式的Client。显然,这样的实现方法存在一些缺陷,如果从部分到整体的关联关系发生了变化,那么我们可能需要同时调整这两种访问方式,从而对系统的代码结构造成比较大的影响。在今天的内容中,我们对组合模式的基本概念以及在Mybatis中的应用方式进行了详细的展开。

2401_83062316的博客 2024

Composite Design Pattern 设计模式组合

设计模式组合,它能够更类组合在一类,形成一个树状结构。 #include <set> #include <iostream> #include <string> using namespace std; class Coporate { protected: string name; set<Coporate *> copo...

weixin_30955341的博客 85
上一篇: 设计模式之 bridge
下一篇: 设计模式之 decorator
Not_Plain
博客等级 码龄17年 23粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值