组合(composite)模式
定义
将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性
组合模式(Composite)将小对象组合成树形结构,使用户操作组合对象如同操作一个单个对象。组合模式定义了“部分-整体”的层次结构,基本对象可以被组合成更大的对象,而且这种操作是可重复的,不断重复下去就可以得到一个非常大的组合对象,但这些组合对象与基本对象拥有相同的接口,因而组合是透明的,用法完全一致。
代码:
#include <iostream>
#include <list>
#include <string>
using namespace std; class IFile
{
public:
virtual void display() = ;
virtual int add(IFile *ifile) = ;
virtual int remove(IFile *ifile) = ;
virtual list<IFile*> *getChild() = ;
}; class File : public IFile
{
public:
File(string name) :_name(name){}
virtual void display()
{
cout << _name << endl;
} virtual int add(IFile *ifile)
{
return -;
} virtual int remove(IFile *ifile)
{
return -;
} virtual list<IFile*>* getChild()
{
return NULL;
} private:
string _name;
}; class Dir : public IFile
{
public:
Dir(string name)
{
_name = name;
_list.clear();
} virtual void display()
{
cout << _name << endl;
} virtual int add(IFile *ifile)
{
_list.push_back(ifile);
return ;
} virtual int remove(IFile *ifile)
{
_list.remove(ifile);
return ;
} virtual list<IFile*> *getChild()
{
return &_list;
} private:
string _name;
list<IFile*> _list;
}; void showTree(IFile *root, int level)
{
if (root == NULL || level < )
return; for (int i = ; i < level; ++i)
{
cout << "\t";
} // 显示根节点
root->display(); // 判断是否为目录
// 如果不是目录,为文件(返回值为NULL),直接返回
//否则遍历目录
list<IFile*> *file_list = root->getChild();
if (file_list == NULL)
return; for (auto it = file_list->begin(); it != file_list->end(); ++it)
{
// 普通文件
if ((*it)->getChild() == NULL)
{
for (int i = ; i <= level; ++i)
{
cout << "\t";
}
// 显示普通文件
(*it)->display();
}
else //目录
{
// 递归 显示该目录下的文件
showTree(*it, level + );
}
}
} void test()
{
IFile *root = new Dir("/");
IFile *aa = new Dir("aa");
IFile *bb = new Dir("bb");
IFile *cc = new Dir("cc");
IFile *dd = new File("dd");
IFile *ee = new File("ee");
IFile *ff = new File("ff");
IFile *gg = new File("gg");
IFile *hh = new Dir("hh");
cc->add(gg);
cc->add(hh); aa->add(cc);
aa->add(dd);
bb->add(ee);
bb->add(ff);
root->add(aa);
root->add(bb); showTree(root, ); } int main()
{
test();
cin.get();
return ;
}
效果:
组合(composite)模式的更多相关文章
- Java 实现组合(Composite)模式
类图 /** * 树 总体 * * @author stone * */ public class Tree { private TreeNode root; //根节点 public Tree(St ...
- C++设计模式实现--组合(Composite)模式
一. 举例 这个样例是书上的,如果有一个公司的组结结构例如以下: 它的结构非常像一棵树,当中人力资源部和財务部是没有子结点的,详细公司才有子结点. 并且最关健的是,它的每一层结构非常相似. 代码实现例 ...
- 设计模式C++描述----11.组合(Composite)模式
一. 举例 这个例子是书上的,假设有一个公司的组结结构如下: 它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点. 而且最关健的是,它的每一层结构很相似. 代码实现如下: / ...
- 八、结构模式之组合(Composite)模式
组合模式属于对象的结构模式,有时又叫做部分-整体模式,组合模式将对象组织到树结构中,可以用来描述整体与部分的联系.其可以使客户端将单纯元素和组合元素同等对待. 当需求中是体现部分与整体层次的结构时,以 ...
- Head First 设计模式 —— 11. 组合 (Composite) 模式
思考题 我们不仅仅要支持多个菜单,升值还要支持菜单中的菜单.你如何处理这个新的设计需求? P355 [提示]在我们的新设计中,真正需要以下三点: P354 我们需要某种属性结构,可以容纳菜单.子菜单和 ...
- 组合模式/composite模式/对象结构型模式
组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...
- 设计模式之Composite(组合)模式
1.出现原因 1.在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即它们在充当对象的同时,又是其他对象的容器. 如何将“客户代码与复杂的对象容器结构”解耦(将这种组合容器对象设计成树形结构 ...
- Java设计模式(8)组合模式(Composite模式)
Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Composite就应该想到树 ...
- Composite模式 组合模式
Android的ViewGroup 和 View 的关系,即是采用组合模式 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件 ...
随机推荐
- PAT-L2-006(根据后序中序遍历建立树)
#include <bits/stdc++.h> using namespace std; ; queue <int> q; int a[N]; int b[N]; int n ...
- set_union和set_intersection
set_union使用方法: set_union(集合A起始地址,集合A终止地址,集合B起始地址,集合B终止地址,插入C集合中(操作:inserter(C.C.begin()))); set_inte ...
- SSAS aggregation 的作用及其使用
作用: 聚合是为了解决查询在运行时的效率低下,在数据立方体部署的时候进行聚合,实际上是对数据立方体的预处理,方便以后查询.如若在部署时未进行聚合,则在以后每次查询时实际上都会进行一次集合的操作,等待结 ...
- [P2051 [AHOI2009]中国象棋] DP
https://www.luogu.org/problemnew/show/P2051 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一 ...
- 《DSP using MATLAB》Problem 7.1
只有春节那么几天才能和家人团聚,看着爸爸妈妈一年比一年老,自己还是一无所有,照顾好自己尚且惭愧,真是悲从中来,又能怎么办呢, 唯有奋发努力,时不我待,多想想怎么赚钱,加油. 代码: function ...
- mysql新建用户在本地无法登录
新建了一个mysql用户,但是无法在本地登录,即使已经授权任一ip都可以登录,甚至特地写清楚localhost登录,还是不行,情况如下 [root@localhost zabbix-release-3 ...
- Cassandra基础2
========================================================= gossip协议1.点对点(peer to perr)的网络通信协议,节点间地位相同 ...
- ORM 创建manytomay的三种方法 反向查询 和一些 双下方法版学员管理系统3
老师信息管理 三种创建多对对外键的方式常用第二种和第三种 思考 三种方式创建多对多外键方式及其优缺点. 外键的查询和使用 1外键的创建: 在数据库表中的表现形式 如何连表查询和使用 表里边: s ...
- Using Elixir Dynamic Supervisors
转自: https://blog.smartlogic.io/elixir-dynamic-supervisors/ I have been working on my side project Gr ...
- SWF 文件不能本地访问 只有仅限于文件系统的 SWF 文件
http://blog.163.com/vituk93@126/blog/static/1709580342012512112757505/ SWF 文件不能被本地访问 不能访问本地 只有仅限于文件系 ...