JAVA 设计模式 组合模式

时间:2021-10-06 07:42:55

用途


组合模式 (Component)
将对象组合成树形结构以表示“部分-整体”的层次结构。
组合模式使得用户对单个对象和组合对象的使用具有唯一性
组合模式是一种结构型模式
结构

aaarticlea/png;base64,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" alt="" />
图-组合模式结构图

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

abstract class Component {

    protected String name;

    

    public Component(String name) {

        this.name = name;

    }

    

    public abstract void Add(Component c);

    public abstract void Remove(Component c);

    public abstract void Display(int depth);

}

Leaf : 表示叶节点对象。叶子节点没有子节点。

class Leaf extends Component {

    public Leaf(String name) {

        super(name);

    }

    @Override

    public void Add(Component c) {

        System.out.println("Can not add to a leaf");

    }

    @Override

    public void Remove(Component c) {

        System.out.println("Can not remove from a leaf");

    }

    @Override

    public void Display(int depth) {

        String temp = "";

        for (int i = 0; i < depth; i++) 

            temp += '-';

        System.out.println(temp + name);

    }

    

}

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

class Composite extends Component {

    private List<Component> children = new ArrayList<Component>();

    

    public Composite(String name) {

        super(name);

    }

    @Override

    public void Add(Component c) {

        children.add(c);

    }

    @Override

    public void Remove(Component c) {

        children.remove(c);

    }

    @Override

    public void Display(int depth) {

        String temp = "";

        for (int i = 0; i < depth; i++) 

            temp += '-';

        System.out.println(temp + name);

        

        for (Component c : children) {

            c.Display(depth + 2);

        }

    }

    

}

Client : 通过 Component 接口操作结构中的对象。

public class CompositePattern {

    public static void main(String[] args) {

        Composite root = new Composite("root");

        root.Add(new Leaf("Leaf A"));

        root.Add(new Leaf("Leaf B"));

        

        Composite compX = new Composite("Composite X");

        compX.Add(new Leaf("Leaf XA"));

        compX.Add(new Leaf("Leaf XB"));

        root.Add(compX);

        

        Composite compXY = new Composite("Composite XY");

        compXY.Add(new Leaf("Leaf XYA"));

        compXY.Add(new Leaf("Leaf XYB"));

        compX.Add(compXY);

        

        root.Display(1);

    }

}
应用场景

1、想要表示对象的部分-整体层次结构。

2、想要客户端忽略组合对象与单个对象的差异,客户端将统一地使用组合结构中的所有对象。

关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统

文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也 可以是目录。

按照这种方式,计算机的文件系统就是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式。

要点


组合模式定义由 Leaf 对象和 Composite 对象组成的类结构;

它使得客户端变得简单;

它使得添加或删除子部件变得很容易。

推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》

《HeadFirst设计模式》