目錄
- 組合模式
- 案例
-
- 需求
- 分析
-
- UML類圖
- 代碼
- 運作結果
- 優缺點總結
-
- 優點
- 缺點
- 應用場景
組合模式
定義:将對象組合成樹形結構以表示 ‘ 部分-整體 ’ 的層次結構。組合模式使得使用者對單個對象群組合對象的使用具有一緻性。
簡單了解,就是,需求中,有部分構成整體的邏輯,然後在代碼中用樹狀結構去實作需求。
比如我們eclipse中項目的展示圖形就是典型的樹狀結構展示。隻不過,這個樹是朝右長的。
可以類比一下這個圖:
案例
下邊就用組合模式,模仿eclipse的項目展示效果,進行輸出
需求
用java代碼模仿eclipse項目樹狀的展示效果。并在控制台輸出。
項目結構:
分析
首先這些東西都是資源——Resources,也就是說可以建個抽象類或者接口。
每個包是一個個的檔案夾——Folder,檔案夾裡邊又可以存檔案夾和檔案,裡邊一定有集合。
java類是一個個的檔案——File,檔案是葉子節點。
UML類圖
代碼
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
對比一下
優缺點總結
優點
1、高層子產品調用簡單。
2、節點自由增加。
缺點
在使用組合模式時,其葉子和樹枝的聲明都是實作類,而不是接口,違反了依賴倒置原則。
應用場景
部分、整體場景,如樹形菜單,檔案、檔案夾的管理。
個人學習總結,如果有錯,希望大佬指針