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





猜你喜欢

转载自blog.csdn.net/u012326462/article/details/80936898