composite模式又叫做组合模式/复合模式。

它是一种能够使容器与内容具有一致性,创造出递归结构的模式。

示例程序是列出文件夹以及其内部文件与文件夹一览的功能:

image

可以由示例图看出,有一个电影文件夹里面有两个文件夹,一个是正常,一个是你懂得。

在正常文件夹里面有三个电影,分别是泰坦尼克号,终结者和钢铁侠。

而在你懂得文件夹里面有两部电影和一个葵司文件夹,两部电影分别是列车.avi和苍老师.avi,而葵司文件里面同样也有两部电影,家庭教师.avi和隔壁小姐姐.avi。

下面是示例代码:

  • SomeThing 文件夹和文件的父类
package site.wangxin520.gof.composite;

/**
 * 所有东西的一个父类
 * @author wangXgnaw
 *
 */
public abstract class SomeThing {

    //名字
    public abstract String getName();
    
    //大小、所占空间
    public abstract int getSize();
    
    //输出打印自己,文件的话,就打印里面所有文件,和自己。如果是文件的话,打印自己
    public abstract void print();
}
  • Directroy 文件夹类
package site.wangxin520.gof.composite;

import java.util.ArrayList;

/**
 * 文件夹的类
 * @author wangXgnaw
 *
 */
public class Directory extends SomeThing{

    private String name;
    private int size;
    
    private ArrayList<SomeThing> arr;
    
    /**
     * 文件夹构造函数,传入文件夹名
     * @param name
     */
    public Directory(String name) {
        this.name=name;
        arr=new ArrayList<>();
    }
    
    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getSize() {
        size=0;
        for (SomeThing someThing : arr) {
            size+=someThing.getSize();
        }
        return size;
    }

    
    /**
     * 递归打印出本文件夹名字和文件夹内部的文件或者文件夹的名字
     */
    @Override
    public void print() {
        System.out.println("文件夹名:"+name+"     大小为:"+getSize());
        for (SomeThing someThing : arr) {
            someThing.print();
        }
    }
    
    /**
     * 文件夹添加东西
     * @param someThing 这里的something既可以是文件夹,又可以是文件
     */
    public void addSomeThing(SomeThing someThing){
        arr.add(someThing);
    }

}
  • File 文件类
package site.wangxin520.gof.composite;

/**
 * 文件类
 * @author wangXgnaw
 *
 */
public class File extends SomeThing{

    private String name;
    private int size;
    
    public File(String name,int size){
        this.name=name;
        this.size=size;
    }
    
    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getSize() {
        return size;
    }

    /**
     * 打印出本文件名
     */
    @Override
    public void print() {
        System.out.println("文件:"+name+"["+size+"]");
    }

}
  • Test测试类
package site.wangxin520.gof.composite;

/**
 * 组合模式的测试类
 * @author wangXgnaw
 *
 */
public class Test {
    public static void main(String[] args) {
        
        Directory moive=new Directory("电影");
        
        Directory normal=new Directory("正常的");
        Directory heihei=new Directory("你懂得");
        
        moive.addSomeThing(normal);
        moive.addSomeThing(heihei);
        
        normal.addSomeThing(new File("终结者.rmvb", 850));
        normal.addSomeThing(new File("泰坦尼克号.rmvb", 770));
        normal.addSomeThing(new File("钢铁侠.rmvb", 1200));
    
        heihei.addSomeThing(new File("列车.avi", 3200));
        Directory kuiSi=new Directory("葵司");
        kuiSi.addSomeThing(new File("葵司-家庭老师.avi", 3000));
        kuiSi.addSomeThing(new File("葵司-隔壁小姐姐.avi", 3000));
        heihei.addSomeThing(new File("苍老师.avi", 1800));
        heihei.addSomeThing(kuiSi);
    
        moive.print();
    }
}
  • 控制台输出结果为:
文件夹名:电影     大小为:13820
文件夹名:正常的     大小为:2820
文件:终结者.rmvb[850]
文件:泰坦尼克号.rmvb[770]
文件:钢铁侠.rmvb[1200]
文件夹名:你懂得     大小为:11000
文件:列车.avi[3200]
文件:苍老师.avi[1800]
文件夹名:葵司     大小为:6000
文件:葵司-家庭老师.avi[3000]
文件:葵司-隔壁小姐姐.avi[3000]

posted on 2017-10-16 20:38  博客王大锤  阅读(449)  评论(0编辑  收藏  举报