15.1.解释

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

main(),客户

CCorpNode,抽象基类,实现基本信息

CBranchNode,树枝节点,实现Addordinate()函数和GetSubordinate()函数

CLeafNode,叶子节点,IsLeaf属性总是“true”

说明:组合模式主要是实现在CBranchNode对象里增加对其它对象的数组,如vector<CCorpNode*>,数组里可以存放CBranchNode和CLeafNode对象。这样方便进行遍历操作。

注意:组合模式有透明组合模式和安全组合模式。透明组合模式是将Addordinate和GetSubordinate这两个函数也抽象到CCorpNode基类里,这增加了操作叶子节点的难度,更易出现逻辑问题。所以尽量使用安全模式。

这个简单了,可以想像一下TreeView和TreeNode基本上是这个意思了,将很多数据组织在一块。

看代码:

//CorpNode.h

#pragma once
#include <iostream>
using std::string;
class CCorpNode
{
public:
    CCorpNode();
    CCorpNode(string _name, string _pos, int _salary);
    virtual ~CCorpNode(void);
    virtual string GetInfo();
    void SetParent(CCorpNode *_pParent);
    CCorpNode * GetParent();
    virtual bool IsLeaf() = 0;
private:
    string m_name;
    string m_position;
    int m_salary;
protected:
    bool m_isLeaf;
    CCorpNode *m_pParent;
};

//CorpNode.cpp

#include "StdAfx.h"
#include "CorpNode.h"
#include "..\CommonDeclare\Convert.h"
CCorpNode::CCorpNode(void)
{
    m_name = "";
    m_position = "";
    m_salary = 0;
}
CCorpNode::CCorpNode(string _name, string _pos, int _salary) : m_name(_name), m_position(_pos), m_salary(_salary)
{
}
CCorpNode::~CCorpNode(void)
{
}
string CCorpNode::GetInfo()
{
    string info = "";
    info.append("姓名:");
    info.append(this->m_name);
    info.append("\t职位:");
    info.append(this->m_position);
    info.append("\t薪水:");
    info.append(CConvert::ToString(this->m_salary));
    return info;
}
void CCorpNode::SetParent( CCorpNode *_parent )
{
    this->m_pParent = _parent;
}
CCorpNode * CCorpNode::GetParent()
{
    return this->m_pParent;
}

//BranchNode.h

#pragma once
#include "corpnode.h"
#include "CorpNode.h"
#include <vector>
#include <iostream>
using std::vector;
using std::string;
class CBranchNode :
    public CCorpNode
{
public:
    CBranchNode(void);
    CBranchNode(string name, string pos, int salary);
    ~CBranchNode(void);
    void Add(CCorpNode *pcorpNode);
    vector<CCorpNode*> GetSubordinateInfo();
    bool IsLeaf();
private:
    vector<CCorpNode*> m_subordinateList;
};
//BranchNode.cpp

#include "StdAfx.h"
#include "BranchNode.h"
CBranchNode::CBranchNode(void)
{
    m_isLeaf = false;
}
CBranchNode::CBranchNode( string name, string pos, int salary ) : CCorpNode(name, pos, salary)
{
    m_isLeaf = false;
}
CBranchNode::~CBranchNode(void)
{
}
void CBranchNode::Add( CCorpNode *pcorpNode )
{
    pcorpNode->SetParent(this);
    m_subordinateList.push_back(pcorpNode);
}
vector<CCorpNode*> CBranchNode::GetSubordinateInfo()
{
    return this->m_subordinateList;
}
bool CBranchNode::IsLeaf()
{
    return m_isLeaf;
}

//LeafNode.h

#pragma once
#include "corpnode.h"
class CLeafNode :
    public CCorpNode
{
public:
    CLeafNode(void);
    CLeafNode(string name, string pos, int salary);
    ~CLeafNode(void);
    bool IsLeaf();
};
//LeafNode.cpp

#include "StdAfx.h"
#include "LeafNode.h"
CLeafNode::CLeafNode(void)
{
    m_isLeaf = true;
}
CLeafNode::CLeafNode( string name, string pos, int salary ) : CCorpNode(name, pos, salary)
{
    m_isLeaf = true;
}
CLeafNode::~CLeafNode(void)
{
}
bool CLeafNode::IsLeaf()
{
    return m_isLeaf;
}

曾经开发过一款Gantt图的控件,采用的就是这种模式,有GanttView和GanttNode两个类,IGanttNode一个接口,GanttScale标尺类。GanttView负责显示,GanttNode是实现类,只有一个GanttNode类来实现数据的组合,IGanttNode指示了一个IGanttNodeCollection属性来记录所有下级结点的集合。算是实践中的一个应用吧。

设计模式C++学习笔记之十五(Composite组合模式)的更多相关文章

  1. 设计模式学习笔记(十五)命令模式及在Spring JdbcTemplate 中的实现

    命令(Command)模式是指将请求封装成为一个对象,使发出请求和执行请求的责任分割开,方便将命令对象进行存储.传递.调用.增加与管理. 也就是将发送者.接收者和调用命令封装成独立的对象,来供客户端调 ...

  2. PHP7 学习笔记(十五)Repository 模式实现业务逻辑和数据访问的分离

    参考: 1.http://laravelacademy.org/post/3063.html

  3. 设计模式C++学习笔记之十(Builder建造者模式)

      建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.一段晦涩难懂的文字,实现创建不同表示的方法就是给创建的过程传入创建的参数.详细的还是看代码吧. 10.1.解释 ...

  4. VSTO学习笔记(十五)Office 2013 初体验

    原文:VSTO学习笔记(十五)Office 2013 初体验 Office 2013 近期发布了首个面向消费者的预览版本,我也于第一时间进行了更新试用.从此开始VSTO系列全面转向Office 201 ...

  5. Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...

  6. [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...

  7. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

  8. Nodejs学习笔记(十五)—Node.js + Koa2 构建网站简单示例

    前言 前面一有写到一篇Node.js+Express构建网站简单示例:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp.html 这篇还 ...

  9. 如鹏网学习笔记(十五)ASP.NET MVC核心基础笔记

    一.ASP.Net MVC简介 1,什么是ASP.NET MVC? HttpHandler是ASP.net的底层机制,如果直接使用HttpHandler进行开发难度比较大.工作量大.因此提供了ASP. ...

随机推荐

  1. java8的Streams

    首先看一个问题:在这个task集合中一共有多少个OPEN状态的?计算出它们的points属性和.在Java 8之前,要解决这个问题,则需要使用foreach循环遍历task集合:但是在Java 8中可 ...

  2. in和hasOwnProperty的区别

    两者都代表查看某个属性是不是对象自己的,返回布尔值 in判断的是对象的所有属性,包括对象实例及其原型的属性 hasOwnProperty则是判断对象实例的是否具有某个属性

  3. 网络编程之Socket & ServerSocket

    网络编程之Socket & ServerSocket Socket:网络套接字,网络插座,建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP ...

  4. ueditor 百度编辑器 粘贴的table表格样式边线

    粘贴html的table表格会有间隔大,黑色边线,可以在: ueditor.all.js 里 找到以下处,修改里面的样式即可 me.ready(function () { utils.cssRule( ...

  5. 调用wait的SIGCHLD信号处理函数

    #include <stdio.h> #include <sys/wait.h> void sig_chld(int signo) { pid_t pid; int stat; ...

  6. IDAPython教程(二)

    继续我们的主题—使用IDAPython 让逆向工程师的生活变得更美好. 这一部分,我们将着手处理一个非常常见的问题:shellcode和恶意软件使用hash算法混淆加载的函数和链接库,这项技术被广泛使 ...

  7. 课堂测试——jsp登录界面设计

    实现结果:在login.jsp页面提交用户名和密码(可以验证是否为空),点击登录跳转到loginResult.jsp页面进行验证并显示结果 JSP + JDBC + MySQL login.jsp 设 ...

  8. SQL Server 远程备份详解

    例1: 有A数据库服务器,B本机: 我现在想通过在B机器上通过代码调用SQL来执行A数据库的备份到B机器上 调用的SQL语句为:Backup Database MYDATABASE To Disk=' ...

  9. Nginx - 配置 SSL证书

    nginx 配置 ssl 证书: 在nginx配置目录创建 cert目录 放置 SSL 的证书秘钥: 也可以使用配置绝对路径 /file/cert/cert.pem server { listen s ...

  10. Linux之恢复误删的文件[针对丢弃到回收站]

    1.丢弃到回收站(非RM)掉的文件一般在目录~/.local/share/Trash/files/下: 2.如何恢复呢? 原理很简单,既然它们还在,要么copy,要么移动到一个新的地方即可嘛. //以 ...