---------把一组相似的对象当作一个单一的对象,为的是减少数据类型。
1、定义一个抽象对象,它可以表示两种或多种实际类型的对象
2、在对象内部,聚合一个抽象类型对象
3、构造时,递归这种关系
4、适合构造属性结构的对象关系
抽象数据类型
- /**
- * 节点结构-组合
- */
- public abstract class Node {
- private String name;
-
- public Node(String name){
- this.name = name;
- }
-
- /**
- * 抽象方法
- * @return
- */
- public abstract List<Node> getChildren();
-
- public String getName() {
- return name;
- }
- }
叶子结点
- /**
- * 叶子节点
- */
- public class LeafNode extends Node{
- public LeafNode(String name) {
- super(name);
- }
-
- @Override
- public List<Node> getChildren() {
- return null;
- }
- }
非叶子结点
- /**
- * 区域划分节点-非叶子节点
- */
- public class DistrictNode extends Node{
-
- // 成员变量 Node 集合
- private List<Node> children = new ArrayList<>();
-
- public DistrictNode(String name) {
- super(name);
- }
-
- // 返回集合
- @Override
- public List<Node> getChildren() {
- return children;
- }
-
- // 集合增加
- public void addChild(Node node){
- children.add(node);
- }
- // 集合减少
- public void delChild(int i){
- children.remove(i);
- }
- }
客户端
- /**
- * 组合模式
- * 省市县目录组织结构
- */
- public class CompositeClient {
- public static void main(String[] args){
- sendFruit();
- }
-
- public static void sendFruit(){
- // 根目录 - 创建根节点
- DistrictNode root = new DistrictNode("根");
-
- //一线目录 - 添加中间节点
- root.addChild(new DistrictNode("上海"));
- root.addChild(new DistrictNode("天津"));
- DistrictNode beijing_Node = new DistrictNode("北京");
- root.addChild(beijing_Node);
-
- //二级目录 - 添加中间节点
- beijing_Node.addChild(new DistrictNode("海淀区"));
- beijing_Node.addChild(new DistrictNode("西城区"));
- DistrictNode chaoyang_Node2 = new DistrictNode("朝阳区");
- beijing_Node.addChild(chaoyang_Node2);
-
- //三级目录 - 添加叶子节点
- chaoyang_Node2.addChild(new LeafNode("三里屯"));
- chaoyang_Node2.addChild(new LeafNode("朝阳外街"));
-
- System.out.println(JSON.toJSON(root));
- }
- }