欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

结构型模式之组合模式

程序员文章站 2023-04-03 13:10:14
组合模式也叫合成模式,用来描述部分与整体的关系。 定义: 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 组合模式类图如下所示。 组合模式提供以下3个角色: 抽象构件(Component)角色:定义参加组合对象的共有方法和属性,规范一些默认的行为接 ......

组合模式也叫合成模式,用来描述部分与整体的关系。

定义:

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

组合模式类图如下所示。

结构型模式之组合模式

组合模式提供以下3个角色:

  • 抽象构件(component)角色:定义参加组合对象的共有方法和属性,规范一些默认的行为接口。
  • 叶子结构(leaf)角色:叶子对象,其下没有其他的分支,定义出参加组合的原始对象的行为。
  • 树枝构件(composite)角色:代表参加组合的、其下有分支的树枝对象,它的作用是将树枝和叶子组合成一个树形结构,并定义出管理子对象的方法,如add()、remove()等。

 component.java

// 定义抽象构件接口
public interface component {
    public void operation();
}

composite.java

// 定义树枝构件
public class composite implements component {
    // 构件容器
    private arraylist<component> componentlist = new arraylist<component>();
    // 添加构件
    public void add(component component) {
        this.componentlist.add(component);
    }
    // 删除构件
    public void remove(component component) {
        this.componentlist.remove(component);
    }
    // 获取子构件
    public arraylist<component> getchild() {
        return this.componentlist;
    }
    @override
    public void operation() {
        system.out.println("业务逻辑代码");
    }
}

 leaf.java

// 定义叶子结构
public class leaf implements component {
    @override
    public void operation() {
        system.out.println("业务逻辑代码leaf");
    }
}

client.java

public class client {
    public static void main(string[] args) {
        // 创建根节点
        composite root = new composite();
        // 创建树枝节点
        composite branch = new composite();
        // 创建叶子节点
        leaf leaf = new leaf();
        root.add(branch);
        branch.add(leaf);
        display(root);
    }
    // 遍历树递归
    public static void display(composite root) {
        for (component c : root.getchild()) {
            if (c instanceof leaf) { // 如果节点类型是叶子节点
                c.operation();
            } else { // 树枝节点
                c.operation();
                display((composite) c);
            }
        }
    }
}

优点:

  • 高层模块调用简单。树形结构中的所有节点都是component,局部和整体对调用者来说没有任何区别,即高层模块不必关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码。
  • 节点*增加。使用组合模式后,如果想增加一个树枝节点,树叶节点只需要找到其父节点即可,

缺点:

  • 不易控制树枝构件的类型。
  • 不易使用新的方法来增加新的行为。

使用场景:

  • 需要描述对象的部分和整体的等级结构,如树形菜单、文件和文件夹管理。
  • 需要客户端忽略个体构件和组合构件的区别,平等对待所有的构件。

摘自:

青岛东合信息技术有限公司 . 设计模式(java版) .  电子工业出版社,2012,86-89.