8.結構型-組合模式

我是60歲程式設計師發表於2020-11-11

1.組合模式介紹
a.組合模式(Composite Pattern),又叫部分整體模式,它建立了物件組的樹形結構,將物件組合成樹狀結構以表示“整體-部分”的層次關係。
b.組合模式依據樹形結構來組合物件,用來表示部分以及整體層次。
c.這種型別的設計模式屬於結構型模式。
d.組合模式使得使用者對單個物件和組合物件的訪問具有一致性,即:組合能讓客戶以一致的方式處理個別物件以及組合物件

2.原理類圖
在這裡插入圖片描述

a. Component :這是組合中物件宣告介面,在適當情況下,實現所有類共有的介面預設行為,用於訪問和管理Component 子部件, Component 可以是抽象類或者介面
b.Leaf : 在組合中表示葉子節點,葉子節點沒有子節點
c.Composite :非葉子節點, 用於儲存子部件, 在 Component 介面中實現 子部件的相關操作,比如增加(add), 刪除。

package com.zjc.designmode.composite;


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


/**
* @author : zoujc
* @date : 2020/11/10
* @description : 組合模式
*/
public class Employee {
    private String name;
    private String dept;
    private int salary;
    private List<Employee> subordinates;


    //建構函式
    public Employee(String name,String dept, int sal) {
        this.name = name;
        this.dept = dept;
        this.salary = sal;
        subordinates = new ArrayList<Employee>();
    }


    public void add(Employee e) {
        subordinates.add(e);
    }


    public void remove(Employee e) {
        subordinates.remove(e);
    }


    public List<Employee> getSubordinates(){
        return subordinates;
    }


    @Override
    public String toString(){
        return ("Employee :[ Name : "+ name
                +", dept : "+ dept + ", salary :"
                + salary+" ]");
    }
}
package com.zjc.designmode.composite;


/**
* @author : zoujc
* @date : 2020/11/10
* @description :
*/
public class Client {
    public static void main(String[] args) {
        Employee CEO = new Employee("John","CEO", 30000);

        Employee headSales = new Employee("Robert","Head Sales", 20000);

        Employee headMarketing = new Employee("Michel","Head Marketing", 20000);

        Employee clerk1 = new Employee("Laura","Marketing", 10000);
        Employee clerk2 = new Employee("Bob","Marketing", 10000);

        Employee salesExecutive1 = new Employee("Richard","Sales", 10000);
        Employee salesExecutive2 = new Employee("Rob","Sales", 10000);

        CEO.add(headSales);
        CEO.add(headMarketing);

        headSales.add(salesExecutive1);
        headSales.add(salesExecutive2);

        headMarketing.add(clerk1);
        headMarketing.add(clerk2);

        //列印該組織的所有員工
        System.out.println(CEO);
        for (Employee headEmployee : CEO.getSubordinates()) {
            System.out.println(headEmployee);
            for (Employee employee : headEmployee.getSubordinates()) {
                System.out.println(employee);
            }
        }
    }
}

3.HaspMap使用了組合模式
Map就是個抽象的構建(類似於Component)
HashMap是一箇中間的構建(Composite),實現/繼承了相關方法
Node是HaspMap的內部類,類似於Leaf的葉子結點,這裡就沒有put,putAll

4.組合模式注意事項
a.簡化客戶端操作。客戶端只需要面對一致的物件而不用考慮整體部分或者節點葉子的問題。
b.具有較強的擴充套件性。當我們要更改組合物件時,我們只需要調整內部的層次關係,客戶端不用做出任何改動.
c.方便建立出複雜的層次結構。客戶端不用理會組合裡面的組成細節,容易新增節點或者葉子從而建立出複雜的樹形結構
d.需要遍歷組織機構,或者處理的物件具有樹形結構時, 非常適合使用組合模式.
e.要求較高的抽象性,如果節點和葉子有很多差異性的話,比如很多方法和屬性都不一樣,不適合使用組合模式

相關文章