国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java設(shè)計(jì)模式之(十)——組合模式

不知名網(wǎng)友 / 3004人閱讀

摘要:什么是組合模式什么是組合模式組合模式將對(duì)象組合成樹形結(jié)構(gòu)以表示部分整體的層次結(jié)構(gòu),使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。組合模式應(yīng)用場(chǎng)景組合模式應(yīng)用場(chǎng)景只要是樹形結(jié)構(gòu),就可以考慮使用組合模式。

1、什么是組合模式?

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

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

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

2、組合模式定義

image-20210912093449012

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

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

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

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

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

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

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

/** * 個(gè)體和整體的抽象 */public abstract class Component {    // 個(gè)體和整體都有的共享    public void doSomething(){        // 通用業(yè)務(wù)邏輯        System.out.println("通用業(yè)務(wù)邏輯");    }}
/** * 樹枝節(jié)點(diǎn) */public class Composite extends Component{    // 構(gòu)件容器    private ArrayList componentArrayList = new ArrayList<>();    // 增加一個(gè)葉子節(jié)點(diǎn)或者樹枝節(jié)點(diǎn)    public void add(Component component){        this.componentArrayList.add(component);    }    // 刪除一個(gè)葉子節(jié)點(diǎn)或者樹枝節(jié)點(diǎn)    public void remove(Component component){        this.componentArrayList.remove(component);    }    // 獲取分支下所有葉子節(jié)點(diǎn)和樹枝節(jié)點(diǎn)    public List 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)邏輯");    }}

測(cè)試:

public class ClientTest {    public static void main(String[] args) {        // 創(chuàng)建一個(gè)根節(jié)點(diǎn)        Composite root = new Composite();        root.doSomething();        // 創(chuàng)建一個(gè)樹枝構(gòu)件        Composite branch = new Composite();        // 創(chuàng)建一個(gè)葉子節(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);            }        }    }}

這里我們?cè)谂e一個(gè)例子:

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

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

image-20210916073028767

/** * 部門類和員工類的抽象類 */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 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;    }}

測(cè)試:

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ù)庫(kù) 所有下屬部門 id        // List subDepartmentIds = departmentRepo.getSubDepartmentIds(department.getId());        List subDepartmentIds = new ArrayList<>();        for (Long subDepartmentId : subDepartmentIds){            Department subDepartment = new Department(subDepartmentId);            department.addSubNode(subDepartment);            buildOrganization(subDepartment);        }        // 根據(jù)部門id 查詢數(shù)據(jù)庫(kù) 其關(guān)聯(lián)員工所有 id        // List employeeIds = employeeRepo.getDepartmentEmployeeIds(department.getId());        List employeeIds = new ArrayList<>();        for (Long employeeId : employeeIds){            // 根據(jù) employeeId 查詢數(shù)據(jù)庫(kù)得到 salary            // 假設(shè)為 1000            double salary = 1000d;            department.addSubNode(new Employee(employeeId,salary));        }    }}

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

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

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

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

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

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

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

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

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

作者:IT可樂

資源:微信搜【IT可樂】關(guān)注我,回復(fù) 【電子書】有我特別篩選的免費(fèi)電子書。
本文版權(quán)歸作者所有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意不能轉(zhuǎn)載,否則保留追究法律責(zé)任的權(quán)利。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/125676.html

相關(guān)文章

  • php設(shè)計(jì)模式

    摘要:我們今天也來做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

    Dionysus_go 評(píng)論0 收藏0
  • php設(shè)計(jì)模式

    摘要:我們今天也來做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

    vspiders 評(píng)論0 收藏0
  • Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強(qiáng))

    摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁(yè)左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無(wú)意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...

    Scorpion 評(píng)論0 收藏0
  • 好文章必讀 - 收藏集 - 掘金

    摘要:方法即為收集器,它接收高階函數(shù)和的后端掘金年的第一天,我坐在獨(dú)墅湖邊,寫下這篇文章。正因如此,所以最全系列教程后端掘金是從版本開始引入的一個(gè)新的,可以替代標(biāo)準(zhǔn)的。 設(shè)計(jì)模式之單例模式 - 掘金前言 作為一個(gè)好學(xué)習(xí)的程序開發(fā)者,應(yīng)該會(huì)去學(xué)習(xí)優(yōu)秀的開源框架,當(dāng)然學(xué)習(xí)的過程中不免會(huì)去閱讀源碼,這也是一個(gè)優(yōu)秀程序員的必備素養(yǎng),在學(xué)習(xí)的過程中很多人會(huì)遇到的障礙,那就是設(shè)計(jì)模式。很多優(yōu)秀的框架會(huì)運(yùn)...

    FrozenMap 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<