学以致用设计模式 之 “组合模式”
练完FTP那个项目之后感觉我整个人都变了,以前我比较倾向于故事和代码实现,现在发现我只想看:模式定义、适用场景、优劣势,这些东西以前我都是一笔带过的。。。
学设计模式,我觉得,知道干嘛用的,自然就能实现出来,要是代码写不出来那不应该来看设计模式,应该去看C++ Primer Plus哈哈哈。
我们来作一棵文件管理树
首先呢,我之所以一直不碰组合模式,是因为它真的庞大,比中介者模式还要庞大,因为它和树挂钩了。
刚弄完FTP,那我们来看一下文件管理的东西: 首先,需要一个根目录,也就是树根;根目录下有各级子目录,也就是各级树枝;各级子目录下呢,又有自己的文件,这就是树叶了。
我们可以从根目录出发,找到任一级目录,也可以找到任一级目录下的任一个文件,这就是从树根开始,沿着路径找到指定树枝,再找到树叶。
那么,要怎么把这么庞大的一个文件管理系统变现呢?我采用的是偷懒的方式,用事务数据库来处理,进行的是数据的“虚假管理”,如果要用代码来管理,那就是“组合模式”的事情了。
你也可以想象成一棵树,树的节点为类节点,但是这棵树,要实现节点插入、节点删除、节点移动、节点查询、节点遍历查询等功能,但凡有点眼力见的人就该知道这些节点的类型需要保持一致性。这点和“备忘录模式”倒是很像,==备忘录是维护一条数组,组合是维护一棵树。==如果记不住就这样记。
云里雾里,云里雾里!来看类图:
图:组合模式(安全模式)
这是组合模式的安全模式,将实现全部放在了子类上。
当然,另一种模式不是“不安全模式”,是“透明模式”噢
图:组合模式(透明模式)
这里需要注意的是,设置子节点,绝不是设置一个子节点,也不是设置俩子节点,而是将子节点信息存在ArrayList中。也不要嫌麻烦,树就是这样的。
只可意会的部分代码
下面的代码,意会就好啦。
class Component{
string info;
public:
virtual string getInfo() = 0;
}
class Composite{
list<Component*> Lcomp;
Component* parent;
int flag;
public:
Composite(){
Lcomp = new list<Component*>;
flag = 0;
}
void setInfo(strint info){this->info = info;}
string getInfo(){return this->info;}
void addCorp(Component* comp){Lcomp->pushback(comp);}
void removeCorp(Component* comp){Lcomp->remove(comp);}
void setParent(Component* p){this->parent = Component;}
Component* getParent(){
if(parent)
return parent;
else
return NULL;
}
Compontent* getChild(){
return Lcomp[flag];
}
void getallChild(Compontent* root){ //比较麻烦的就是遍历整棵树了
while((c = root->getChild())!=NULL){
if(c is leaf){
c->disomething();
}
else{
getallChild(c);
}
}
}
}
使用场景
场景很明确了,要用到树结构的地方,就可以考虑一下组合模式的思想:高层统一,层次分明。
- Nginx软件部署配置过程
- iptables网络安全服务详细使用
- 未来哪个行业能赚钱,看百度、阿里、腾讯投资的企业你就知道了!
- Augmate公司应用分布式账本技术,将IOTA整合为物联网设备管理平台
- 一域名一年前六位数终端易主 是为了......
- 黑客通过Facebook Messenger传播加密货币挖掘恶意软件
- linq to sql的多条件动态查询(下)
- iptables网络安全服务详细使用
- iptables网络安全服务详细使用
- linq to sql的多条件动态查询(上)
- 极简区块链手册:什么是区块链?什么是比特币?
- Nginx+keepalived实现高可用
- 来一波Linux中查看cpu、磁盘、内存、网络的命令
- PXE+kickstart网络安装CentOS7.4系统及过程中各种报错
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法