java设计模式十三之组合设计模式

前言:

    组合设计模式也叫Composite模式,是构造型的设计模式之一,用来表示整组对象的树形结构,其实就是把数据整合成树形结构。

怎么实现:

       1.抽象根节点,树形结构节点的抽象

       2.具体叶子节点

       3.具体枝节点


代码:

    枝和叶子的抽象父类:

package com.xhx.designpattern;

import java.util.List;

/**
 * xuhaixing
 * 2018/7/6 8:42
 *
 * 文件节点抽象(是文件和目录的父类)
 **/
public abstract class IFile {
    protected String name;
    public IFile(String name){
        this.name=name;
    }

    //显示文件或者文件夹的名称
    public abstract  void display();

    //添加
    public abstract  boolean add(IFile iFile);

    //移除
    public abstract  boolean remove(IFile iFile);

    //获得子节点
    public abstract  List<IFile> getChild();
}


子类叶子节点:

package com.xhx.designpattern;

import java.util.List;

/**
 * xuhaixing
 * 2018/7/6 8:44
 **/
public class File extends IFile {

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

    public void display() {
        System.out.println(name);
    }

    public boolean add(IFile iFile) {
        return false;
    }

    public boolean remove(IFile iFile) {
        return false;
    }

    public List<IFile> getChild() {
        return null;
    }
}

子类枝节点:

package com.xhx.designpattern;

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

/**
 * xuhaixing
 * 2018/7/6 8:46
 **/
public class Folder extends IFile {
    private List<IFile> children;

    public Folder(String name){
        super(name);
        children = new ArrayList<IFile>();
    }

    public void display() {
        System.out.println(name);
    }

    public boolean add(IFile iFile) {
        return children.add(iFile);
    }

    public boolean remove(IFile iFile) {
        return children.remove(iFile);
    }

    public List<IFile> getChild() {
        return children;
    }
}


测试方法,用递归的方式做循环

package com.xhx.designpattern;

import java.util.List;
import java.util.Objects;
import java.util.Observer;

/**
 * xuhaixing
 * 2018/7/6 8:50
 **/
public class App {
    public static void main(String[] args) {
        Folder root = new Folder("c:");
        Folder rootFolder = new Folder("program files");
        File cmdFile = new File("cmd.exe");

        root.add(rootFolder);
        rootFolder.add(cmdFile);

        displayTree(root);
    }

    public static void displayTree(IFile root){
        if(Objects.isNull(root)){
            return;
        }
        root.display();
        List<IFile> child = root.getChild();
        if(Objects.isNull(child)||child.size()<=0){
            return;
        }
        child.stream().forEach(iFile->displayTree(iFile ));
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值