成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇了解組合模式應該怎么用

開發 前端
假設我們在開發一個 OA 系統(辦公自動化系統)。公司的組織結構包含部門和員工兩種數據類型。其中,部門又可以包含子部門和員工。

1.什么是組合模式?

Compose objects into tree structures to represent part-whole hierarchies.Composite lets clients treat individual objects and compositions of objects uniformly.

組合模式(Composite Pattern):將對象組合成樹形結構以表示“部分-整體”的層次結構, 使得用戶對單個對象和組合對象的使用具有一致性。

說人話:用于處理樹形結構數據。

2.組合模式定義

圖片

①Component 抽象構件角色

定義參加組合對象的共有方法和屬性,可以定義一些默認的行為或屬性。

②Leaf 葉子節點

葉子對象,其下再也沒有其他的子節點,是遍歷的最小單位。

③Composite 樹枝構件

樹枝對象,作用是組合樹枝節點和葉子節點形成一個樹形結構。

3.組合模式通用代碼實現

/**
* 個體和整體的抽象
*/
public abstract class Component {
// 個體和整體都有的共享
public void doSomething(){
// 通用業務邏輯
System.out.println("通用業務邏輯");
}
}
/**
* 樹枝節點
*/
public class Composite extends Component{
// 構件容器
private ArrayList<Component> componentArrayList = new ArrayList<>();

// 增加一個葉子節點或者樹枝節點
public void add(Component component){
this.componentArrayList.add(component);
}

// 刪除一個葉子節點或者樹枝節點
public void remove(Component component){
this.componentArrayList.remove(component);
}

// 獲取分支下所有葉子節點和樹枝節點
public List<Component> getChildren(){
return this.componentArrayList;
}
}
/**
* 葉子節點
*/
public class Leaf extends Component {

// 覆寫父類方法
@Override
public void doSomething() {
// 葉子節點邏輯
System.out.println("葉子節點邏輯");
}
}

測試:

public class ClientTest {

public static void main(String[] args) {
// 創建一個根節點
Composite root = new Composite();
root.doSomething();
// 創建一個樹枝構件
Composite branch = new Composite();
// 創建一個葉子節點
Leaf leaf = new Leaf();

// 串聯起來
root.add(branch);
branch.add(leaf);

display(root);
}

// 通過遞歸遍歷數
public static void display(Composite root){
for(Component c : root.getChildren()){
if(c instanceof Leaf){ // 葉子節點
c.doSomething();
}else{
display((Composite) c);
}
}
}
}

這里我們在舉一個例子:

假設我們在開發一個 OA 系統(辦公自動化系統)。公司的組織結構包含部門和員工兩種數據類型。其中,部門又可以包含子部門和員工。

我們希望在內存中構建整個公司的人員架構圖(部門、子部門、員工的隸屬關系),并且提供接口計算出部門的薪資成本(隸屬于這個部門的所有員工的薪資和)。

圖片

/**
* 部門類和員工類的抽象類
*/
public abstract class HumanResource {
protected long id;
protected double salary;

public HumanResource(long id){
this.id = id;
}

public long getId(){
return id;
}

public abstract double calculateSalary();

}
public class Department extends HumanResource{
private List<HumanResource> subNodes = new ArrayList<>();

public Department(long id){
super(id);
}

@Override
public double calculateSalary() {
double totalSalary = 0d;
for (HumanResource hr : subNodes){
totalSalary += hr.calculateSalary();
}
this.salary = totalSalary;
return totalSalary;
}

public void addSubNode(HumanResource humanResource){
subNodes.add(humanResource);
}
}
public class Employee extends HumanResource{
public Employee(long id,double salary){
super(id);
this.salary = salary;
}

@Override
public double calculateSalary() {
return salary;
}
}

測試:

public class PersonClientTest {
private static final long ORGANIZATION_ROOT_ID = 1;

public static void main(String[] args) {
// 創建總部門
Department root = new Department(ORGANIZATION_ROOT_ID);

// 創建子部門
Department branch = new Department(2L);

// 創建員工
Employee employee1 = new Employee(21L,2000);
Employee employee2 = new Employee(22L,4000);

root.addSubNode(branch);
branch.addSubNode(employee1);
branch.addSubNode(employee2);

double v = root.calculateSalary();
System.out.println(v);
}

private void buildOrganization(Department department){
// 根據 部門id 查詢數據庫 所有下屬部門 id
// List<Long> subDepartmentIds = departmentRepo.getSubDepartmentIds(department.getId());
List<Long> subDepartmentIds = new ArrayList<>();

for (Long subDepartmentId : subDepartmentIds){
Department subDepartment = new Department(subDepartmentId);
department.addSubNode(subDepartment);
buildOrganization(subDepartment);
}

// 根據部門id 查詢數據庫 其關聯員工所有 id
// List<Long> employeeIds = employeeRepo.getDepartmentEmployeeIds(department.getId());
List<Long> employeeIds = new ArrayList<>();
for (Long employeeId : employeeIds){
// 根據 employeeId 查詢數據庫得到 salary
// 假設為 1000
double salary = 1000d;
department.addSubNode(new Employee(employeeId,salary));
}


}
}

4.組合模式優點

①高層模塊調用簡單

一棵樹形機構中的所有節點都是Component, 局部和整體對調用者來說沒有任何區別,也就是說, 高層模塊不必關心自己處理的是單個對象還是整個組合結構, 簡化了高層模塊的代碼。

②節點自由增加

使用了組合模式后,  如果想增加一個樹枝節點、 葉子節點都很容易, 只要找到它的父節點就成, 非常容易擴展, 符合開閉原則, 對以后的維護非常有利。

5.組合模式應用場景

只要是樹形結構,就可以考慮使用組合模式。

①維護和展示部分-整體關系的場景, 如樹形菜單、 文件和文件夾管理。

②從一個整體中能夠獨立出部分模塊或功能的場景。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2021-07-14 10:08:30

責任鏈模式加工鏈

2021-07-28 10:02:54

建造者模式代碼

2022-03-07 06:34:22

CQRS數據庫數據模型

2022-10-26 07:39:36

MVCC數據庫RR

2022-12-19 08:14:30

注解開發配置

2021-07-08 06:30:03

Linux CPULinux 系統

2021-05-20 06:57:16

RabbitMQ開源消息

2021-09-16 11:32:19

組合總和

2021-10-28 19:15:02

IPUARM

2021-07-10 09:02:42

編程語言 TypeScript

2020-10-09 08:15:11

JsBridge

2023-06-16 07:41:36

分層架構軟件架構

2021-09-14 07:26:26

組合問題循環

2021-12-30 09:38:51

DDoS攻擊防范

2023-05-12 08:19:12

Netty程序框架

2022-06-08 00:10:33

數據治理框架

2021-10-30 07:55:00

BLE 藍牙開發

2021-07-14 08:24:23

TCPIP 通信協議

2021-06-30 00:20:12

Hangfire.NET平臺

2021-08-11 07:02:21

npm包管理器工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品高潮呻吟久久 | 爱草视频 | 一区二区三区 在线 | 99re6热在线精品视频播放 | 成人国产毛片 | 一级毛片视频 | 日日操夜夜摸 | 影音先锋亚洲资源 | 欧美日韩一区二区三区四区 | 99re免费| 中文在线一区二区 | 雨宫琴音一区二区在线 | 亚洲视频免费在线观看 | a免费视频 | 综合网中文字幕 | 国产精品久久精品 | 男人天堂免费在线 | 欧美精品一区二区三区视频 | 国产精品视频一二三区 | 日韩视频在线一区二区 | 欧美一级一区 | 97国产精品视频人人做人人爱 | 国产精品视频网站 | 久久久久久久一区 | 国产福利资源 | 97视频在线免费 | 欧美黄色一区 | 亚洲精品成人av久久 | aaa一区| 成年人网站国产 | 日本韩国欧美在线观看 | 一级毛片免费 | 国产精品欧美一区喷水 | 91毛片在线看 | 欧美午夜一区二区三区免费大片 | 国产一级淫片免费视频 | av在线一区二区三区 | 中文字幕免费观看 | 国产成人精品久久 | 久久久一区二区三区 | 日韩二|