最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文徹底了解Java的組合模式

 更新時(shí)間:2023年02月24日 10:33:34   作者:初念初戀  
組合模式(Composite?Pattern)指將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),?使得用戶對單個對象和組合對象的使用具有一致性。本文就來帶大家深入了解一下Java的組合模式吧

相信樹形結(jié)構(gòu)大家都知道,但是你是否知道用到了什么設(shè)計(jì)模式嗎?

1、什么是組合模式

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

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

說人話:用于處理樹形結(jié)構(gòu)數(shù)據(jù)。

2、組合模式定義

①、Component 抽象構(gòu)件角色

定義參加組合對象的共有方法和屬性,可以定義一些默認(rèn)的行為或?qū)傩浴?/p>

②、Leaf 葉子節(jié)點(diǎn)

葉子對象,其下再也沒有其他的子節(jié)點(diǎn),是遍歷的最小單位。

③、Composite 樹枝構(gòu)件

樹枝對象,作用是組合樹枝節(jié)點(diǎn)和葉子節(jié)點(diǎn)形成一個樹形結(jié)構(gòu)。

3、組合模式通用代碼實(shí)現(xiàn)

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

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

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

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

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

測試:

public class ClientTest {

    public static void main(String[] args) {
        // 創(chuàng)建一個根節(jié)點(diǎn)
        Composite root = new Composite();
        root.doSomething();
        // 創(chuàng)建一個樹枝構(gòu)件
        Composite branch = new Composite();
        // 創(chuàng)建一個葉子節(jié)點(diǎn)
        Leaf leaf = new Leaf();

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

        display(root);
    }

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

這里我們在舉一個例子:

假設(shè)我們在開發(fā)一個 OA 系統(tǒng)(辦公自動化系統(tǒng))。公司的組織結(jié)構(gòu)包含部門和員工兩種數(shù)據(jù)類型。其中,部門又可以包含子部門和員工。

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

/**
 * 部門類和員工類的抽象類
 */
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) {
        // 創(chuàng)建總部門
        Department root = new Department(ORGANIZATION_ROOT_ID);

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

        // 創(chuàng)建員工
        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){
        // 根據(jù) 部門id 查詢數(shù)據(jù)庫 所有下屬部門 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);
        }

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

    }
}

4、組合模式優(yōu)點(diǎn)

①、高層模塊調(diào)用簡單

一棵樹形機(jī)構(gòu)中的所有節(jié)點(diǎn)都是Component, 局部和整體對調(diào)用者來說沒有任何區(qū)別,也就是說, 高層模塊不必關(guān)心自己處理的是單個對象還是整個組合結(jié)構(gòu), 簡化了高層模塊的代碼。

②、節(jié)點(diǎn)自由增加

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

5、組合模式應(yīng)用場景

只要是樹形結(jié)構(gòu),就可以考慮使用組合模式。

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

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

到此這篇關(guān)于一文徹底了解Java的組合模式的文章就介紹到這了,更多相關(guān)Java組合模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot 實(shí)現(xiàn)敏感詞及特殊字符過濾處理

    Spring Boot 實(shí)現(xiàn)敏感詞及特殊字符過濾處理

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)敏感詞及特殊字符過濾處理方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 簡述JAVA中堆內(nèi)存與棧內(nèi)存的區(qū)別

    簡述JAVA中堆內(nèi)存與棧內(nèi)存的區(qū)別

    這篇文章主要介紹了JAVA中堆內(nèi)存與棧內(nèi)存的區(qū)別,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Java HashMap底層實(shí)現(xiàn)原理

    Java HashMap底層實(shí)現(xiàn)原理

    HashMap在不同的JDK版本下的實(shí)現(xiàn)是不同的,在JDK1.7時(shí),HashMap 底層是通過數(shù)組+鏈表實(shí)現(xiàn)的;而在JDK1.8時(shí),HashMap底層是通過數(shù)組+鏈表或紅黑樹實(shí)現(xiàn)的,本詳細(xì)介紹了HashMap底層是如何實(shí)現(xiàn)的,需要的朋友可以參考下
    2023-05-05
  • Spring中異步注解@Async的使用、原理及使用時(shí)可能導(dǎo)致的問題及解決方法

    Spring中異步注解@Async的使用、原理及使用時(shí)可能導(dǎo)致的問題及解決方法

    這篇文章主要介紹了Spring中異步注解@Async的使用、原理及使用時(shí)可能導(dǎo)致的問題及解決方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java Swing中JDialog實(shí)現(xiàn)用戶登陸UI示例

    Java Swing中JDialog實(shí)現(xiàn)用戶登陸UI示例

    這篇文章主要介紹了Java Swing中JDialog實(shí)現(xiàn)用戶登陸UI功能,結(jié)合完整實(shí)例形式分析了Swing使用JDialog實(shí)現(xiàn)用戶登陸UI界面窗口功能的步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • Java多線程之ThreadLocal淺析

    Java多線程之ThreadLocal淺析

    這篇文章主要分析了Java多線程ThreadLocal,ThreadLocal叫做線程變量,用于在多線程環(huán)境下創(chuàng)建線程本地變量。想了解更多的可以參考本文
    2023-04-04
  • 將Maven鏡像源更改為阿里鏡像的操作步驟

    將Maven鏡像源更改為阿里鏡像的操作步驟

    在軟件開發(fā)中,Maven是一個流行的項(xiàng)目管理工具,它允許你從Maven中央倉庫下載所需的依賴包,然而,由于地理位置或網(wǎng)絡(luò)狀況的差異,從默認(rèn)的Maven中央倉庫下載依賴包的速度可能會較慢,所
    2025-01-01
  • MyBatis 全局配置文件詳解

    MyBatis 全局配置文件詳解

    MyBatis的全局配置文件定義了MyBatis的全局行為,本文主要介紹了MyBatis 全局配置文件詳解,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 基于springMVC web.xml中的配置加載順序

    基于springMVC web.xml中的配置加載順序

    這篇文章主要介紹了springMVC web.xml中的配置加載順序,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring Cloud Gateway 獲取請求體(Request Body)的多種方法

    Spring Cloud Gateway 獲取請求體(Request Body)的多種方法

    這篇文章主要介紹了Spring Cloud Gateway 獲取請求體(Request Body)的多種方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01

最新評論

濮阳市| 平陆县| 沾益县| 凤冈县| 宁海县| 项城市| 蓬溪县| 夏河县| 呼伦贝尔市| 无棣县| 福贡县| 繁峙县| 西藏| 阜新| 贵南县| 礼泉县| 库尔勒市| 玛多县| 清涧县| 广宗县| 图木舒克市| 和平县| 诸城市| 林甸县| 舟山市| 玛沁县| 张家界市| 文登市| 明光市| 台北县| 明溪县| 武威市| 高密市| 灵武市| 临海市| 都江堰市| 益阳市| 阳曲县| 江西省| 浪卡子县| 雅江县|