设计模式——组合模式

介绍

用于把一组相似的对象当作一个单一的对象,通常以树形解构来组合对象,用于表示部分以及整体层次。

意图

将对象组合成树形解构表示“部分-整体”的结构层次。组合模式是的用于对单个对象和组合对象的使用具有一致性。

解决

它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

优点

  1. 高层模块调用简单;
  2. 节点自由增加。

缺点

  1. 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

使用场景

部分、整体场景,如树形菜单,文件、文件夹的管理。

UML

示例

树节点 TreeNode.java

package cn.geoaryblog.design.cretedg.composite;

import java.util.ArrayList;
import java.util.List;

public class TreeNode {
    private String name;
    private List<TreeNode> treeNodeList = null;

    public TreeNode(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public List<TreeNode> getTreeNodeList() {
        return treeNodeList;
    }

    public synchronized void addNode(TreeNode treeNode){
        if (treeNodeList == null){
            treeNodeList = new ArrayList<>();
        }
        treeNodeList.add(treeNode);
    }

    @Override
    public String toString() {
        return "TreeNode{" +
                "name='" + name + '\'' +
                '}';
    }
}

客户端 Clinet.java

package cn.geoaryblog.design.cretedg.composite;

public class Clinet {
    public static void main(String[] args) {
        TreeNode rootNode = new TreeNode("根节点");
        TreeNode cDisk = new TreeNode("c盘");
        TreeNode dDisk = new TreeNode("d盘");
        TreeNode programFile = new TreeNode("Program Files");
        dDisk.addNode(programFile);
        rootNode.addNode(cDisk);
        rootNode.addNode(dDisk);
        System.out.println(rootNode);
        for(TreeNode rootSub: rootNode.getTreeNodeList()){
            System.out.println(rootSub);
            if(rootSub.getName() == "d盘"){
                for(TreeNode dp: dDisk.getTreeNodeList()){
                    System.out.println(dp);
                }
            }
        }
    }
}
posted @   Geoary  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示