组合模式

Posted lovebolin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了组合模式相关的知识,希望对你有一定的参考价值。

  组合模式又叫合成模式,有时又叫整体-部分模式,主要用来描述整体和部分的关系,其定义为:将对象组合成树形结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

  先说说组合模式的几个角色:

  • Component抽象构件角色:定义参加组合对象的共有方法和属性,也可以定义一些默认的行为或属性
  • Leaf叶子构件:叶子对象,其下再没有分支,也就是遍历的最小单位
  • Composite树枝构件:组合抽象构件和叶子构件形成一个树形结构

下面看一个通用代码示例:

//抽象构件
public abstract class Component{
    //个体和整体都具有的共享
    public void doSomething(){
    }
}
//树枝构件,也是组合模式的重点
public class Composite extends Component{
    //构件容器
    private ArrayList<Component> componentArrayList = new ArrayList();
    //增加一个叶子构件或树枝构件
    public void add(Component conponent){
        this.componentArrayList.add(conponent);
    }
    //删除一个叶子构件或树枝构件
    public void remove(Component conponent){
        this.componentArrayList.remove(conponent);
    }
    //获得分支下的所有叶子构件或树枝构件
    public ArrayList<Component> getChild(){
        return this.componentArrayList;
    }
}
//树叶构件
public class Leaf extends Component{
    //可以选择性覆写父类方法
    public void doSomething(){
    }
}
//场景类
public class Client{
    public static void main(String[] args){
        Composite root = new Composite();
        root.doSomething();
        Composite branch = new Composite();
        Leaf leaf = new Leaf();
        //建立整体
        root.add(branch);
        branch.add(leaf);
    }
}

组合模式的优点:

  • 高层模块调用简单。一颗树形结构中的所有节点都是Component,局部和整体对调用者来说没有任何区别,也就是说,高层模块不必关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码。
  • 节点自由增加。使用了组合模式后,如果想增加一个树枝节点或叶子节点都是非常容易的,只要找到它的父节点就行,非常容易扩展。

组合模式的缺点:

  • 树枝和叶子构件都直接使用了实现类,这在面向接口编程是不恰当的,也违背了依赖倒置原则。

使用场景:

  • 维护部分-整体关系的场景,如树形菜单、文件和文件管理。
  • 从一个整体中能够独立出部分模块或功能的场景。

注意事项:

  只要是树形结构,就要考虑使用组合模式,只要是体现局部和整体关系的时候,而且关系还比较深,就要考虑使用组合模式。

以上是关于组合模式的主要内容,如果未能解决你的问题,请参考以下文章

如何组合绑定片段而不将它们包装在 XML 文字中

48个值得掌握的JavaScript代码片段(上)

Tailwind.css 体验总结

Tailwind.css 体验总结

用于从 cloudkit 检索单列的代码模式/片段

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解!(转载)