• (11)组合设计模式


    一、客户订单的目的地问题

    二、组合模式

    ---------把一组相似的对象当作一个单一的对象,为的是减少数据类型。

    1、定义一个抽象对象,它可以表示两种或多种实际类型的对象

    2、在对象内部,聚合一个抽象类型对象

    3、构造时,递归这种关系

    4、适合构造属性结构的对象关系

    三、代码实例

    抽象数据类型

    1. /**
    2. * 节点结构-组合
    3. */
    4. public abstract class Node {
    5. private String name;
    6. public Node(String name){
    7. this.name = name;
    8. }
    9. /**
    10. * 抽象方法
    11. * @return
    12. */
    13. public abstract List<Node> getChildren();
    14. public String getName() {
    15. return name;
    16. }
    17. }

    叶子结点

    1. /**
    2. * 叶子节点
    3. */
    4. public class LeafNode extends Node{
    5. public LeafNode(String name) {
    6. super(name);
    7. }
    8. @Override
    9. public List<Node> getChildren() {
    10. return null;
    11. }
    12. }

    非叶子结点

    1. /**
    2. * 区域划分节点-非叶子节点
    3. */
    4. public class DistrictNode extends Node{
    5. // 成员变量 Node 集合
    6. private List<Node> children = new ArrayList<>();
    7. public DistrictNode(String name) {
    8. super(name);
    9. }
    10. // 返回集合
    11. @Override
    12. public List<Node> getChildren() {
    13. return children;
    14. }
    15. // 集合增加
    16. public void addChild(Node node){
    17. children.add(node);
    18. }
    19. // 集合减少
    20. public void delChild(int i){
    21. children.remove(i);
    22. }
    23. }

    客户端

    1. /**
    2. * 组合模式
    3. * 省市县目录组织结构
    4. */
    5. public class CompositeClient {
    6. public static void main(String[] args){
    7. sendFruit();
    8. }
    9. public static void sendFruit(){
    10. // 根目录 - 创建根节点
    11. DistrictNode root = new DistrictNode("根");
    12. //一线目录 - 添加中间节点
    13. root.addChild(new DistrictNode("上海"));
    14. root.addChild(new DistrictNode("天津"));
    15. DistrictNode beijing_Node = new DistrictNode("北京");
    16. root.addChild(beijing_Node);
    17. //二级目录 - 添加中间节点
    18. beijing_Node.addChild(new DistrictNode("海淀区"));
    19. beijing_Node.addChild(new DistrictNode("西城区"));
    20. DistrictNode chaoyang_Node2 = new DistrictNode("朝阳区");
    21. beijing_Node.addChild(chaoyang_Node2);
    22. //三级目录 - 添加叶子节点
    23. chaoyang_Node2.addChild(new LeafNode("三里屯"));
    24. chaoyang_Node2.addChild(new LeafNode("朝阳外街"));
    25. System.out.println(JSON.toJSON(root));
    26. }
    27. }

  • 相关阅读:
    C++调用VSS API进行快照
    【python基础】random模块常用方法讲解
    MySQL数据库(五)
    JDBC学习笔记(三)高级篇
    【文件读取/包含】任意文件读取漏洞 afr_2
    OpenFeign的三种远程调用方式
    从0开始写中国象棋-创建棋盘与棋子
    【老生谈算法】matlab实现低阶函数的二维图像获取——二维图像获取
    小程序开发一个多少钱啊
    使用VSCode中遇到的问题及解决办法
  • 原文地址:https://blog.csdn.net/qq_17021569/article/details/125616363