一 概述
抽象理念:由于事物与事物之间存在某种关系,通过组织起来并形成某种结构并且可以共同发挥作用;
组合模式本质:二叉树–根部分出来两个枝杈(左节点,右节点),每个枝杈上又可以继续分叉,直到末端的叶子为止:
分形理论:不管是连绵的山川、飘浮的云朵、岩石的断裂口、树冠、花菜、还是人类的大脑皮层,把这些部分与整体以某种方式相似的形体呈现出来就称为分形;
部分/整体的结构:从其中抽出任意一个“部分”,其与“整体”的结构是类似的,因此在“树”结构中,无论是根、枝、还是叶子,都可以将其抽象为“节点”,模糊其行为差异,从而达到模糊简单元素与复杂元素的目的;
二 使用示例
节点;
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