组合模式 Composite Pattern

一、什么是组合模式
Composite模式也叫组合模式,是构造型的设计模式之一。通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树。

二、组合模式的结构



三、组合模式的角色和职责

Component (树形结构的节点抽象)

- 为所有的对象定义统一的接口(公共属性,行为等的定义)
- 提供管理子节点对象的接口方法
- [可选]提供管理父节点对象的接口方法

Leaf (树形结构的叶节点)
Component的实现子类

Composite(树形结构的枝节点)

Component的实现子类


IFile.java
import java.util.List; 

/* 
 * 文件节点抽象(是文件和目录的父类) 
 */ 
public interface IFile { 
 
    //显示文件或者文件夹的名称 
    public void display(); 
 
    //添加 
    public boolean add(IFile file); 
 
    //移除 
    public boolean remove(IFile file); 
 
    //获得子节点 
    public List<IFile> getChild(); 
}
File.java
import java.util.List; 

public class File implements IFile { 
    private String name; 
 
    public File(String name) { 
        this.name = name; 
    } 
 
 
    public void display() { 
        System.out.println(name); 
    } 
 
    public List<IFile> getChild() { 
        return null; 
    } 
 
 
    public boolean add(IFile file) { 
        return false; 
    } 
 
    public boolean remove(IFile file) { 
        return false; 
    } 
 
}
Folder.java
import java.util.ArrayList; 
import java.util.List; 
 
public class Folder implements IFile{ 
    private String name; 
    private List<IFile> children; 
 
    public Folder(String name) { 
        this.name = name; 
        children = new ArrayList<IFile>(); 
    } 
 
 
    public void display() { 
        System.out.println(name); 
    } 
 
    public List<IFile> getChild() { 
        return children; 
    } 
 
 
    public boolean add(IFile file) { 
        return children.add(file); 
    } 
 
 
    public boolean remove(IFile file) { 
        return children.remove(file); 
    } 
}
MainClass.java
import java.util.List; 
public class MainClass { 
    public static void main(String[] args) { 
        //C盘 
        Folder rootFolder = new Folder("C:"); 
        //beifeng目录 
        Folder beifengFolder = new Folder("beifeng"); 
        //beifeng.txt文件 
        File beifengFile = new File("beifeng.txt"); 
 
        rootFolder.add(beifengFolder); 
        rootFolder.add(beifengFile); 
 
        //ibeifeng目录 
        Folder ibeifengFolder = new Folder("ibeifeng"); 
        File ibeifengFile = new File("ibeifeng.txt"); 
        beifengFolder.add(ibeifengFolder); 
        beifengFolder.add(ibeifengFile); 
 
        Folder iibeifengFolder = new Folder("iibeifeng"); 
        File iibeifengFile = new File("iibeifeng.txt"); 
        ibeifengFolder.add(iibeifengFolder); 
        ibeifengFolder.add(iibeifengFile); 
 
        displayTree(rootFolder,0); 
 
    } 
 
    public static void displayTree(IFile rootFolder, int deep) { 
        for(int i = 0; i < deep; i++) { 
            System.out.print("--"); 
        } 
        //显示自身的名称 
        rootFolder.display(); 
        //获得子树 
        List<IFile> children = rootFolder.getChild(); 
        //遍历子树 
        for(IFile file : children) { 
            if(file instanceof File) { 
                for(int i = 0; i <= deep; i++) { 
                    System.out.print("--"); 
                } 
                file.display(); 
            } else { 
                displayTree(file,deep + 1); 
            } 
        } 
    } 
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值