8、COMPOSITE(组合模式)

目的

将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

使用场景

  • 想表示对象的部分-整体层次结构
  • 希望用户忽略3组合对象和单个对象的不同,统一的使用组合结构中的所有对象

具体使用

对于一个文件系统来说,我们对于文件和文件的操作其实基本是差不多的,因此可以使用组合模式,采用一种树形结构来管理这些元素。
对于该模式的UML如下:


8、COMPOSITE(组合模式)_第1张图片
UML

在我的例子中,我定义了一个File类,相当于UML中的Component,在这里面有Folder类、Jpg File和TextFile类都相当于UML中的Leaf。如果在JpgFile和TextFile上抽象一个类,那么这个类就相当于Composite类。

File类该类相当于Component

package composite;

/**
 * 文件类抽象类,包含具体文件和文件夹
 */
public abstract class File {
    protected String name;
    public File(String name){
        this.name = name;
    }
    //增加文件
    public abstract void addFile(File file);
    //删除文件
    public abstract void deleteFile(File file);
    //杀毒方法
    public abstract void killVirus();
    public String getName(){
        return name;
    }
}

Folder该类代表文件夹类,相当于Leaf

package composite;

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

/**
 * 文件夹类
 */
public class Folder extends File{
    //文件夹中包含多个文件
    List files = new ArrayList<>();
    public Folder(String name){
        super(name);
    }
    //定义增加文件夹新建方法
    @Override
    public void addFile(File file){
        System.out.println(name+"增加文件"+file.getName());
        files.add(file);
    }
    //定义删除文件的方法
    @Override
    public void deleteFile(File file){
        System.out.println(name+"删除文件"+file.getName());
        files.remove(file);
    }
    //定义文件夹杀毒方法
    @Override
    public void killVirus(){
        System.out.println(name+"对文件夹中所有文件杀毒");
        for(File file:files){
            file.killVirus();
        }
    }
}

JpgFile该类代表一个具体文件

package composite;

public class JpgFile extends File{
    public JpgFile(String name){
        super(name);
    }
    @Override
    public void addFile(File file){
        System.out.println(name+"无法增加文件"+file.getName());
    }
    @Override
    public void deleteFile(File file){
        System.out.println(name+".jpg无法删除文件"+file.getName());
    }
    @Override
    public void killVirus(){
        System.out.println(name+"开始杀毒");
    }
}

TxtFile该类代表一个具体文件,是一个Leaf

package composite;

public class TxtFile extends File {
    public TxtFile(String name){
        super(name);
    }
    @Override
    public void addFile(File file){
        System.out.println(name+".txt文件中无法新建文件");
    }
    @Override
    public void deleteFile(File file){
        System.out.println(name+".txt文件无法删除其中的文件");
    }
    @Override
    public void killVirus(){
        System.out.println(name+".txt文件杀毒");
    }
}

Client测试文件

package composite;

public class Client {
    public static void main(String[] args) {
        //创建一个叫root的文件夹
        File root = new Folder("root");
        //创建一个txt文件和一个jpg文件
        File txtFile = new TxtFile("txtFile");
        File jpgFile = new JpgFile("jpgFile");

        //将这两个文件加入root中
        root.addFile(txtFile);
        root.addFile(jpgFile);
        root.killVirus();

        //删除文件夹中的文件
        root.deleteFile(txtFile);
        root.deleteFile(jpgFile);
    }

}

你可能感兴趣的:(8、COMPOSITE(组合模式))