原博主地址:(https://blog.csdn.net/LoveLion/article/details/17517213)
其实到现在没有理解这模式有什么特别,不就是用抽象类吗?不过还是用了代码来实现
2020-12-09
组合模式的意思是:无论是容器还是具体对象,都属于组合对象。
组合模式(Composite Pattern):组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。
抽象文件类
package test2019.mon01.组合模式;
/**
* Filename: AbstFile.java Description: Company: sendinfo.com.cn Inc.
*
* @author: guzhangyan
* @date: 2019年1月27日 下午5:06:10
*/
public abstract class AbstFile {
public void add(AbstFile file) {
}
public void remove(AbstFile file) {
}
public AbstFile get(int key) {
return null;
}
public abstract void show();
}
java文件类
package test2019.mon01.组合模式;
/**
* Filename: JavaFile.java Description: Company: sendinfo.com.cn Inc.
*
* @author: guzhangyan
* @date: 2019年1月27日 下午5:07:49
*/
public class JavaFile extends AbstFile {
private String name;
@Override
public void show() {
System.out.println("show Java文件: " + name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
FTL文件类
package test2019.mon01.组合模式;
/**
* Filename: JavaFile.java
* Description:
* Company: sendinfo.com.cn Inc.
* @author: guzhangyan
* @date: 2019年1月27日 下午5:07:49
*/
public class FtlFile extends AbstFile{
private String name;
@Override
public void show() {
System.out.println("show ftl文件: "+name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Other文件类
package test2019.mon01.组合模式;
/**
* Filename: JavaFile.java
* Description:
* Company: sendinfo.com.cn Inc.
* @author: guzhangyan
* @date: 2019年1月27日 下午5:07:49
*/
public class OtherFile extends AbstFile{
private String name;
@Override
public void show() {
System.out.println("show other文件: "+name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Folder文件类
package test2019.mon01.组合模式;
import java.util.ArrayList;
import java.util.List;
/**
* Filename: JavaFile.java Description: Company: sendinfo.com.cn Inc.
*
* @author: guzhangyan
* @date: 2019年1月27日 下午5:07:49
*/
public class FolderFile extends AbstFile {
private List<AbstFile> fileList = new ArrayList<AbstFile>();
private String name;
@Override
public void add(AbstFile file) {
fileList.add(file);
}
@Override
public void remove(AbstFile file) {
fileList.remove(file);
}
@Override
public AbstFile get(int key) {
return fileList.get(key);
}
@Override
public void show() {
System.out.println("show folder文件: " + name);
for (AbstFile abstFile : fileList) {
abstFile.show();
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试类
package test2019.mon01.组合模式;
import java.io.File;
/**
* Filename: Test.java
* Description:
* Company: sendinfo.com.cn Inc.
* @author: guzhangyan
* @date: 2019年1月27日 下午5:17:32
*/
public class Test {
public static void main(String[] args) {
File file = new File("D:\\work\\sendinfoSkiAndPw\\skiAndPw\\sendinfo-ski\\src\\main");
AbstFile mainFile = changeTo(file);
mainFile.show();
}
//读取文件,变成相应对象
private static AbstFile changeTo(File file) {
if(file.isDirectory()) {
FolderFile folderFile = new FolderFile();
folderFile.setName(file.getName());
for (File fileTemp : file.listFiles()) {
AbstFile deFile = changeTo(fileTemp);
folderFile.add(deFile);
}
return folderFile;
}
String fileName = file.getName();
if("java".equals(fileName.substring(fileName.lastIndexOf(".") + 1))) {
JavaFile javaFile = new JavaFile();
javaFile.setName(file.getName());
return javaFile;
}
if("ftl".equals(fileName.substring(fileName.lastIndexOf(".") + 1))) {
FtlFile ftlFile = new FtlFile();
ftlFile.setName(file.getName());
return ftlFile;
}
OtherFile otherFile = new OtherFile();
otherFile.setName(file.getName());
return otherFile;
}
}