组合模式Combination

一 概述

抽象理念:由于事物与事物之间存在某种关系,通过组织起来并形成某种结构并且可以共同发挥作用;
组合模式本质:二叉树–根部分出来两个枝杈(左节点,右节点),每个枝杈上又可以继续分叉,直到末端的叶子为止:

分形理论:不管是连绵的山川、飘浮的云朵、岩石的断裂口、树冠、花菜、还是人类的大脑皮层,把这些部分与整体以某种方式相似的形体呈现出来就称为分形;

部分/整体的结构:从其中抽出任意一个“部分”,其与“整体”的结构是类似的,因此在“树”结构中,无论是根、枝、还是叶子,都可以将其抽象为“节点”,模糊其行为差异,从而达到模糊简单元素与复杂元素的目的

二 使用示例

节点;

package cn.http.test;

/**
 * 组合模式:节点的概念
 *
 * @author:wjm
 * @date:2020/6/26 18:24
 */
public abstract class Node {
    /**
     * 节点名字
     */
    protected String name;

    /**
     * 构造节点并命名
     *
     * @param name
     */
    public Node(String name) {
        this.name = name;
    }

    /**
     * 添加子节点
     *
     * @param child
     */
    protected abstract void add(Node child);
}

继承节点的文件夹;

package cn.http.test;

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

/**
 * 组合模式:文件夹
 *
 * @author:wjm
 * @date:2020/6/26 19:04
 */
public class CustomFolder extends Node {
    /**
     * 文件夹可以包含子节点(子节点可以是一个文件夹也可以是一个文件)
     */
    public List<Node> childrenNodes = new ArrayList<>();

    public CustomFolder(String name) {
        super(name);
    }

    @Override
    protected void add(Node child) {
        this.childrenNodes.add(child);
    }
}

继承节点的文件;

package cn.http.test;

/**
 * 组合模式:文件
 *
 * @author:wjm
 * @date:2020/6/26 19:08
 */
public class CustomFile extends Node {
    public CustomFile(String name) {
        super(name);
    }

    @Override
    protected void add(Node child) {
        System.out.println("该节点不允许添加子节点");
    }
}

应用;

package cn.http.test;

/**
 * 应用
 *
 * @author:wjm
 * @date:2020/6/26 19:09
 */
public class Test {
    public static void main(String[] args) {
        Node disk = new CustomFolder("硬盘C");

        Node musicFolder = new CustomFolder("音乐");
        Node videoFolder = new CustomFolder("视频");

        Node music1 = new CustomFile("音乐1.mp3");
        Node music2 = new CustomFile("音乐2.mp3");
        Node music3 = new CustomFile("音乐3.mp3");

        Node video1 = new CustomFile("视频1.avi");
        Node video2 = new CustomFile("视频2.avi");
        Node video3 = new CustomFile("视频3.avi");

        musicFolder.add(music1);
        musicFolder.add(music2);
        musicFolder.add(music3);

        videoFolder.add(video1);
        videoFolder.add(video2);
        videoFolder.add(video3);

        disk.add(musicFolder);
        disk.add(videoFolder);
    }
}

三 总结

组合模式的本质,是抽象出共同的根属性(根节点),将功能抽象成由根节点产生不同的子节点,子节点又可以继续产生子节点,直到最终的“叶子”(二叉树结构),然后通过不同节点相互组合产生结果(例如文件夹功能),他强调的是节点与节点之间是像二叉树一样的结构(强调结构型)

源码地址:我的GitHub

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值