天天看點

用eclipse的樹狀項目展示,告訴你什麼是組合模式(composite)組合模式案例優缺點總結應用場景

目錄

  • 組合模式
  • 案例
    • 需求
    • 分析
      • UML類圖
      • 代碼
      • 運作結果
  • 優缺點總結
    • 優點
    • 缺點
  • 應用場景

組合模式

定義:将對象組合成樹形結構以表示 ‘ 部分-整體 ’ 的層次結構。組合模式使得使用者對單個對象群組合對象的使用具有一緻性。

簡單了解,就是,需求中,有部分構成整體的邏輯,然後在代碼中用樹狀結構去實作需求。

比如我們eclipse中項目的展示圖形就是典型的樹狀結構展示。隻不過,這個樹是朝右長的。

用eclipse的樹狀項目展示,告訴你什麼是組合模式(composite)組合模式案例優缺點總結應用場景

可以類比一下這個圖:

用eclipse的樹狀項目展示,告訴你什麼是組合模式(composite)組合模式案例優缺點總結應用場景

案例

下邊就用組合模式,模仿eclipse的項目展示效果,進行輸出

需求

用java代碼模仿eclipse項目樹狀的展示效果。并在控制台輸出。

項目結構:

用eclipse的樹狀項目展示,告訴你什麼是組合模式(composite)組合模式案例優缺點總結應用場景

分析

首先這些東西都是資源——Resources,也就是說可以建個抽象類或者接口。

每個包是一個個的檔案夾——Folder,檔案夾裡邊又可以存檔案夾和檔案,裡邊一定有集合。

java類是一個個的檔案——File,檔案是葉子節點。

UML類圖

用eclipse的樹狀項目展示,告訴你什麼是組合模式(composite)組合模式案例優缺點總結應用場景

代碼

Resources

package 組合模式composite;

public abstract class Resources {
	public String name;
	
	public Resources(String name) {
		this.name = name;
	}
	
	public abstract void add(Resources r);
	
	public abstract void remove(Resources r);
	
	public abstract void dispay(int depth);
}

           

File

package 組合模式composite;

import java.util.ArrayList;
import java.util.List;

public class File extends Resources{
	
	List<Resources> rList = new ArrayList<>();

	public File(String name) {
		super(name);
	}
	
	@Override
	public void add(Resources r) {
		System.out.println("操作錯誤");
	}
	
	@Override
	public void remove(Resources r) {
		System.out.println("操作錯誤");
	}
	
	@Override
	public void dispay(int depth) {
		for (int i = 0; i < depth; i++) {
			System.out.print("   ");
		}
		System.out.println(name);
	}
	
}

           

Folder

package 組合模式composite;

import java.util.ArrayList;
import java.util.List;

public class Folder extends Resources{

	List<Resources> rList = new ArrayList<>();

	public Folder(String name) {
		super(name);
	}

	@Override
	public void add(Resources r) {
		rList.add(r);
	}
	
	@Override
	public void remove(Resources r) {
		rList.remove(r);
	}
	
	@Override
	public void dispay(int depth) {
		for (int i = 0; i < depth; i++) {
			System.out.print("   ");
		}
		System.out.println(name);
		depth++;
		for (Resources resources : rList) {
			resources.dispay(depth);
		}
	}
	
}
           

Client

package 組合模式composite;

public class Client {

	public static void main(String[] args) {
		// 建立model檔案夾
		Folder model = new Folder("model");

		// 建立dao檔案夾
		Folder dao = new Folder("dao");

		// 建立entity檔案夾
		Folder entity = new Folder("entity");
		// 建立UserDAO.java檔案并加入到entity檔案夾
		entity.add(new File("UserDAO.java"));
		// 将entity檔案夾添加到dao
		dao.add(entity);

		// 建立inteface檔案夾
		Folder inteface = new Folder("inteface");
		// 建立IUserDAO.java檔案并加入到inteface檔案夾
		inteface.add(new File("IUserDAO.java"));
		// 建立impl檔案夾
		Folder impl = new Folder("impl");
		// 建立IUserDAOImpl.java檔案并加入到impl檔案夾
		impl.add(new File("IUserDAOImpl.java"));
		// 将impl檔案夾添加到inteface
		inteface.add(impl);
		// 将inteface檔案夾添加到dao
		dao.add(inteface);

		// 将dao檔案夾添加到model
		model.add(dao);



		// 建立factory檔案夾
		Folder factory = new Folder("factory");
		// 建立DAOFactory.java檔案并加入到factory檔案夾
		factory.add(new File("DAOFactory.java"));
		// 建立ServiceFactory.java檔案并加入到factory檔案夾
		factory.add(new File("ServiceFactory.java"));

		// 将factory檔案夾添加到model
		model.add(factory);




		// 建立jdbc檔案夾
		Folder jdbc = new Folder("jdbc");
		// 建立DatabaseConnection.java檔案并加入到jdbc檔案夾
		jdbc.add(new File("DatabaseConnection.java"));

		// 将jdbc檔案夾添加到model
		model.add(jdbc);




		// 建立service檔案夾
		Folder service = new Folder("service");
		// 建立IUserService.java檔案并加入到service檔案夾
		service.add(new File("IUserService.java"));
		// 建立jdbc檔案夾
		Folder impl2 = new Folder("impl");
		
		// 建立IUserServiceImpl.java檔案并加入到service檔案夾
		service.add(new File("IUserServiceImpl.java"));

		// 建立impl2檔案夾加入到service檔案夾
		service.add(impl2);


		// 将service檔案夾添加到model
		model.add(service);

		
		// 列印檔案夾樹狀目錄
		model.dispay(0);


	}

}
           

運作結果

model
   dao
      entity
         UserDAO.java
      inteface
         IUserDAO.java
         impl
            IUserDAOImpl.java
   factory
      DAOFactory.java
      ServiceFactory.java
   jdbc
      DatabaseConnection.java
   service
      IUserService.java
      IUserServiceImpl.java
      impl
           

對比一下

用eclipse的樹狀項目展示,告訴你什麼是組合模式(composite)組合模式案例優缺點總結應用場景

優缺點總結

優點

1、高層子產品調用簡單。

2、節點自由增加。

缺點

在使用組合模式時,其葉子和樹枝的聲明都是實作類,而不是接口,違反了依賴倒置原則。

應用場景

部分、整體場景,如樹形菜單,檔案、檔案夾的管理。

個人學習總結,如果有錯,希望大佬指針