設計模式學習(十一):組合模式

2022-11-11 12:02:06

設計模式學習(十一):組合模式

作者:Grey

原文地址:

部落格園:設計模式學習(十一):組合模式

CSDN:設計模式學習(十一):組合模式

組合模式

組合模式是一種結構型模式。

組合模式中,最常用的一個用法就是目錄層級的遍歷,話不多說,直接上程式碼,主方法中

public class Main {
    public static void main(String[] args) {
        BranchNode root = new BranchNode("root");
        BranchNode branch1 = new BranchNode("branch1");
        BranchNode branch2 = new BranchNode("branch2");
        branch1.addNode(new LeafNode("leaf1"));
        root.addNode(branch1);
        root.addNode(branch2);
        tree(root, 0);
    }
}

其中, BranchNode 為分支節點, LeafNode 是葉子節點 達到的效果就是列印如下的形式

root
--branch1
----leaf1
--branch2

遞迴方法

    static void tree(Node node, int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("--");
        }
        node.print();
        if (node instanceof BranchNode) {
            for (Node n : ((BranchNode) node).getNodes()) {
                tree(n, depth + 1);
            }
        }
    }

其中 BranchNode 和 LeafNode 都實現了 Node 介面,Node 介面(也可以為定義抽象類)僅提供了一個屬性( content 屬性,用於標識節點內容)和一個列印方法:

public abstract class Node {
    protected String content;

    protected abstract void print();
}

BranchNode 下可以包含多個 Node,因為一個分支下面可以有多個分支(這個分支可以是任意的 Node 子類)

public class BranchNode extends Node {
    private List<Node> nodes = new ArrayList<>();

    public BranchNode(String content) {
        this.content = content;
    }

    @Override
    public void print() {
        System.out.println(content);
    }    // get..set方法略 
}

組合模式的 UML 圖如下:

組合模式的應用

MyBatis解析各種 Mapping 檔案中的 SQL 語句時,設計了一個非常關鍵的類叫作 SqlNode,XML 中的每一個 Node 都會被解析為一個 SqlNode 物件,最後把所有 SqlNode 都拼裝到一起,就成為一條完整的 SQL 語句。

UML 和 程式碼

UML 圖

程式碼

更多

設計模式學習專欄

參考資料