结构型模式之组合模式

Posted yewen1234

tags:

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

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

定义:

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

组合模式类图如下所示。

技术分享图片

组合模式提供以下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.

 

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

设计模式探秘之组合模式

设计模式之组合模式

设计模式之组合模式

设计模式之组合模式

JAVA SCRIPT设计模式--结构型--设计模式之Composite组合模式

结构型模式之组合模式