GoF設計模式-組合模式

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章