组合模式(Composite)

简介: 组合模式(Composite)

一、什么是组合模式?

将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。


a257308656b11a999cb64e38479a9490.png


Client:客户端


Component:组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component的子部件。


Leaf:在组合中表示叶节点对象,叶节点没有子节点。


Composite:定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关的操作,比如增加Add和删除Remove。



两种模式:


透明方式

也就是说在Component中声明所有用来管理子对象的方法,其中包括Add、Remove等。这样实现Component接口的所有子类都具备了Add和Remove。这样做的好处就是叶节点和枝节点对于外界没有区别,他们具备完全一致的行为接口。但问题也很明显,因为Leaf类本身不具备Add()、Remove()方法的功能,所以实现它是没有意义的。



安全方式

也就是在Component接口中不去声明Add()和Remove方法,那么子类的Leaf也就不需要去实现它,而是在Composite声明所有用来管理子类对象的方法,不过由于不够透明,所以树叶和树枝类将不具有相同的接口,客户端的调用需要做相应的判断,带来了不便。




二、有什么优点?

高层模块调用简单。一棵树形机构中的所有节点都是Component,局部和整体对调用者来说没有任何区别,高层模块不必关心自己处理的是单个对象还是整个组合结构。

节点自由增加


三、有什么缺点?

使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒转原则


四、什么时候适用?

需求中是体现部分与整体层次的机构(树形结构)时;


用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有第项时




五、代码展示

①、组合模式



 

Component类

//为组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为。
    //声明一个接口用于访问和管理Component的子部件
    abstract class Component
    {
        protected string name;         //成员变量
        public Component(string name) //有参构造方法
        {
            this.name = name;
        }
        //通常都用Add和Remove方法来提供增加或移除树叶或树枝的功能
        public abstract void Add(Component c);
        public abstract void Remove(Component c);
        public abstract void Display(int depth);
    }

Leaf类

//在组合中表示叶节点对象,叶节点没有子节点
    class Leaf : Component
    {
        public Leaf(string name) : base(name) { }
        public override void Add(Component c)
        {
            Console.WriteLine("Cannot add to a leaf");
        }
        public override void Remove(Component c)
        {
            Console.WriteLine("Cannot remove from a leaf");
        }
        public override void Display(int depth)
        {
            //叶节点的具体方法,此处是显示其名称和级别
            Console.WriteLine(new string('-', depth) + name);
        }
    }

Composite类

//定义有枝节点行为,用来存储子部件,在Component接口中
//实现与子部件有关的操作,比如增加Add和删除Remove
    class Composite : Component
    {
        //一个子对象集合用来存储其下属的枝节点和叶节点
        private List<Component> children = new List<Component>();
        public Composite (string name) : base(name) { }
        public override void Add(Component c)
        {            
                children.Add(c);
        }
        public override void Remove(Component c)
        {
            children.Remove(c);
        }
        public override void Display(int depth)
        {
            //显示其枝节点名称,并对其下级进行遍历
            Console.WriteLine(new string('-', depth) + name);
            foreach(Component component in children)
            {
                component.Display(depth + 2);
            }
        }
    }
目录
相关文章
|
6月前
|
设计模式 Java 容器
设计模式~组合模式(composite)-16
目录 (1)优点: (2)缺点: (3)使用场景: (4)注意事项: (5)应用实例 代码
30 0
|
10月前
|
前端开发
关于组合模式我所知道的
关于组合模式我所知道的
37 0
|
11月前
|
设计模式 Java 数据安全/隐私保护
Java设计模式-组合模式(Composite)
Java设计模式-组合模式(Composite)
|
存储 设计模式 安全
结构型模式 - 组合模式(Composite Pattern)
结构型模式 - 组合模式(Composite Pattern)
|
设计模式 Java 容器
组合模式
组合模式
|
安全 Java 容器
结构型:组合模式 Composite
主要内容有: 该模式的介绍,包括: 引子、意图(大白话解释) 类图、时序图(理论规范) 该模式的代码示例:熟悉该模式的代码长什么样子 该模式的优缺点:模式不是万金油,不可以滥用模式 该模式的应用案例:了解它在哪些重要的源码中被使用
133 0
|
设计模式 算法
结构型-Composite
组合模式的原理与实现在 GoF 的《设计模式》一书中,组合模式是这样定义的: Compose objects into tree structure to represent part-whole hierarchies.Composite lets client treat individual objects and compositions of objects uniformly. 翻译成中文就是:将一组对象组织(Compose)成树形结构,以表示一种“部分 - 整体”的层次结构。组合让客户端(在很多设计模式书籍中,“客户端”代指代码的使用者。)可以统一单个对象和组合对象的处理逻辑。
101 0
|
存储 设计模式 Java
浅谈JAVA设计模式之——组合模式(Composite)
将对象组合成树形结构以表示"部分-整体"的层次结构。"Composite使得用户对单个对象和组合对象的使用具有一致性。
197 0
浅谈JAVA设计模式之——组合模式(Composite)
|
Java 设计模式