8、COMPOSITE(组合模式)
2019-05-23 本文已影响0人
我要扭开奥利奥
目的
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
使用场景
- 想表示对象的部分-整体层次结构
- 希望用户忽略3组合对象和单个对象的不同,统一的使用组合结构中的所有对象
具体使用
对于一个文件系统来说,我们对于文件和文件的操作其实基本是差不多的,因此可以使用组合模式,采用一种树形结构来管理这些元素。
对于该模式的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<File> 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);
}
}