(11)组合设计模式

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

二、组合模式

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

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));
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值