学以致用设计模式 之 “组合模式”

简介:

在这里插入图片描述

练完FTP那个项目之后感觉我整个人都变了,以前我比较倾向于故事和代码实现,现在发现我只想看:模式定义、适用场景、优劣势,这些东西以前我都是一笔带过的。。。

学设计模式,我觉得,知道干嘛用的,自然就能实现出来,要是代码写不出来那不应该来看设计模式,应该去看C++ Primer Plus哈哈哈。

@[toc]

我们来作一棵文件管理树

首先呢,我之所以一直不碰组合模式,是因为它真的庞大,比中介者模式还要庞大,因为它和树挂钩了。

刚弄完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);
            }
        }
    }
}

使用场景

场景很明确了,要用到树结构的地方,就可以考虑一下组合模式的思想:高层统一,层次分明。

相关文章
|
2月前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 组合模式
js设计模式【详解】—— 组合模式
39 7
|
2天前
|
设计模式 Java
Java设计模式:组合模式的介绍及代码演示
组合模式是一种结构型设计模式,用于将多个对象组织成树形结构,并统一处理所有对象。例如,统计公司总人数时,可先统计各部门人数再求和。该模式包括一个通用接口、表示节点的类及其实现类。通过树形结构和节点的通用方法,组合模式使程序更易扩展和维护。
Java设计模式:组合模式的介绍及代码演示
|
3月前
|
设计模式 存储 安全
Java设计模式:组合模式之透明与安全的两种实现(七)
Java设计模式:组合模式之透明与安全的两种实现(七)
|
3月前
|
设计模式 Java
Java设计模式之组合模式详解
Java设计模式之组合模式详解
|
3月前
|
设计模式
组合模式-大话设计模式
组合模式-大话设计模式
|
4月前
|
设计模式 Java 容器
【设计模式系列笔记】组合模式
组合模式(Composite Pattern)是一种结构型设计模式,它允许将对象组合成树状结构以表示部分-整体的层次结构。组合模式使得客户端可以统一处理单个对象和对象组合,而无需区分它们的类型。
73 12
|
4月前
|
设计模式 Go
[设计模式 Go实现] 结构型~组合模式
[设计模式 Go实现] 结构型~组合模式
|
4月前
|
设计模式 安全 Java
[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式
[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式
|
4月前
|
设计模式 Java
【设计模式】文件目录管理是组合模式吗?
【设计模式】文件目录管理是组合模式吗?
27 0
|
4月前
|
设计模式 存储 Java
23种设计模式,组合模式的概念优缺点以及JAVA代码举例
【4月更文挑战第5天】组合模式(Composite Pattern)是一种结构型设计模式,旨在通过将对象组合成树形结构以表示部分-整体的层次结构,使用户对单个对象和组合对象的使用具有一致性。这种模式让客户可以统一地处理单个对象和组合对象
66 6