组合模式(重要):
结构型模式,又叫整体-部分模式,将叶子对象与容器对象递归组合,使得用户在使用时无须区别,可以一致地使用叶子对象和容器对象。
叶子对象:只能作为普通对象适用
容器对象:既能作为普通对象,又可作为其他对象的容器,提供一个集成存储子节点
组合模式的角色:抽象类或接口(是叶子类和容器类的父类),叶子类,容器类
安全组合模式:在抽象父类中仅定义叶子类与容器类共有的方法,缺点是不够透明,用户不能够完全一致使用叶子类和容器类,不能完全面向抽象编程,在实际使用中,安全组合模式使用频率较高
透明组合模式:在抽象父类中定义叶子类和容器类的所有方法,使用户一致地使用它们,缺点是不安全,在调用叶子类中没有的方法时需要抛出异常
组合模式的适用场景:
1.树形结构的开发
2.对于具有整体与部分的层次结构中,想要一致地使用它们
组合模式的优点:
1.一致地使用叶子和容器对象,简化了客户端代码
2.可以组合形成复杂的树形结构,方便地对层次进行控制
组合模式的缺点:
1.设计变得更加抽象
2.增加新的类时会有问题,难以对特定类型的类进行限制约束
组合模式的例子(文件和文件夹组合,安全组合模式)
抽象父类
public abstract class AbsFileAndFolder {
public abstract void printFileName();
}
叶子类(文件类)
public class File extends AbsFileAndFolder{
private String fileName;
public File(String fileName) {
this.fileName = fileName;
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月10日
* @throws
* @return
* @see structual.CompositePattern.AbsFileAndFolder#printFileName()
*/
@Override
public void printFileName() {
System.out.println(fileName);
}
}
容器类(文件夹类)
public class Folder extends AbsFileAndFolder{
private String folderName;
List<AbsFileAndFolder> fileAndFolderList = new ArrayList<AbsFileAndFolder>();
public Folder(String folderName) {
this.folderName = folderName;
}
/**
* @Description: 打印文件名字
* @author doudou
* @date 2019年10月10日
* @throws
* @return
* @see structual.CompositePattern.AbsFileAndFolder#printFileName()
*/
@Override
public void printFileName() {
System.out.println(folderName);
for(AbsFileAndFolder absFileAndFolder:fileAndFolderList) {
absFileAndFolder.printFileName();
}
}
/**
*
* @Description: 添加
* @author doudou
* @date 2019年10月10日
* @param absFileAndFolder
* @throws
* @return
*/
public void add(AbsFileAndFolder absFileAndFolder) {
fileAndFolderList.add(absFileAndFolder);
}
/**
*
* @Description: 删除
* @author doudou
* @date 2019年10月10日
* @param absFileAndFolder
* @throws
* @return
*/
public void remove(AbsFileAndFolder absFileAndFolder) {
fileAndFolderList.remove(absFileAndFolder);
}
}
测试类
public class Main {
public static void main(String[] args) {
Folder folder = new Folder("设计模式");
Folder subFolder = new Folder("设计模式资料");
subFolder.add(new File("《设计模式》"));
folder.add(subFolder);
folder.add(new File("设计模式期末考试卷"));
folder.printFileName();
}
}
组合模式的应用:
1.XML文档的解析
2.操作系统中对文件和文件夹的操作