組合模式(重要):
結構型模式,又叫整體-部分模式,將葉子對象與容器對象遞歸組合,使得用戶在使用時無須區別,可以一致地使用葉子對象和容器對象。
葉子對象:只能作爲普通對象適用
容器對象:既能作爲普通對象,又可作爲其他對象的容器,提供一個集成存儲子節點
組合模式的角色:抽象類或接口(是葉子類和容器類的父類),葉子類,容器類
安全組合模式:在抽象父類中僅定義葉子類與容器類共有的方法,缺點是不夠透明,用戶不能夠完全一致使用葉子類和容器類,不能完全面向抽象編程,在實際使用中,安全組合模式使用頻率較高
透明組合模式:在抽象父類中定義葉子類和容器類的所有方法,使用戶一致地使用它們,缺點是不安全,在調用葉子類中沒有的方法時需要拋出異常
組合模式的適用場景:
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.操作系統中對文件和文件夾的操作