抽丝剥茧——组合设计模式

2021-01-05 22:30:58 浏览数 (2)

组合设计模式

兄弟们好,今天我们来聊一下组合设计模式。没错这里面的组合就是我们经常用来代替继承的组合。

而组合设计模式强调的是:「将对象组合成树形结构来表现“部分和整体”的层次结构,可以让客户端通过一种方式处理单个对象或者多个对象组合。」

我们看一下它的角色组成:

  • 组合部件(Component):抽象角色,为要组合的对象提供统一的接口,「客户端要调用的功能。」
  • 叶子(Leaf):在组合中表示结对对象,叶子节点中不能有子节点
  • 合成部件(Composite):定义有子节点的行为,用来存储部件,实现在Component中的功能。

我们看一下它的类图实现:

我们再来看一下它的代码实现:

「组合部件(Component)」

代码语言:javascript复制
abstract class Node {
    abstract void print();
}

「叶子节点(Leaf)」

代码语言:javascript复制
class ConentNode extends Node {
    private String content ;
    public ConentNode(String content){ this.content = content ; }
    void print() {
        System.out.println(this.content);
    }
}

「合成部件(Composite)」

代码语言:javascript复制
class MiddleNode extends Node {
    private List<Node> listNodes = new ArrayList<>();
    private String content ;
    public List<Node> getListNodes(){return listNodes;}
    public MiddleNode(String content){ this.content = content ; }
    void print() {
        System.out.println(this.content);
    }
    public MiddleNode addNode(Node node){
        this.listNodes.add(node);
        return this ;
    }
}

「测试」

代码语言:javascript复制
public static void main(String[] args) {
        MiddleNode node = new MiddleNode("root");
        MiddleNode node1 = new MiddleNode("chapter1");
        MiddleNode node2 = new MiddleNode("chapter2");
        Node node1_1 = new ConentNode("content1_1");
        Node node1_2 = new ConentNode("content1_2");
        Node node1_3 = new ConentNode("content1_3");
        Node node2_1 = new ConentNode("content2_1");
        Node node2_2 = new ConentNode("content2_2");
        node.addNode(node1).addNode(node2);
        node1.addNode(node1_1).addNode(node1_2).addNode(node1_3);
        node2.addNode(node2_1).addNode(node2_2);
        printNodeContent(node,0);
    }

 //通过这个方法打印每一个节点的值,递归的方式(一个树遍历)
    static void printNodeContent(Node node,int depth){
        //为了增加层次,每一层打印一个--
        for (int i = 0; i < depth; i  ) {
            System.out.print("--");
        }
        node.print();
        if(node instanceof MiddleNode){
            MiddleNode node1  = (MiddleNode)node ;
            for (Node node2 : node1.getListNodes()){
                printNodeContent(node2,depth 1);
            }
        }
    }

「运行结果」

代码语言:javascript复制
root
--chapter1
----content1_1
----content1_2
----content1_3
--chapter2
----content2_1
----content2_2

好了,到这里组合设计模式就讲完了,其本质就是「通过将不同的对象组合成树形的结构,让客户端可以统一通过同一个方法进行调用执行。」

0 人点赞