国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

設(shè)計模式——10. 組合模式

這篇具有很好參考價值的文章主要介紹了設(shè)計模式——10. 組合模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1. 說明

組合模式是一種結(jié)構(gòu)型設(shè)計模式,用于將對象組合成樹狀結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。它允許客戶端以一致的方式處理單個對象和組合對象(包含多個對象的容器),使得客戶端無需關(guān)心它們之間的差異。

組合模式通常涉及兩種主要角色:

  1. 葉子節(jié)點(Leaf):這是組合中的基本對象,它不能包含其他對象。葉子節(jié)點執(zhí)行特定操作。
  2. 組合節(jié)點(Composite):這是包含子對象的復(fù)雜對象。組合節(jié)點通常執(zhí)行某種操作,然后將操作傳遞給其子節(jié)點。

組合模式的關(guān)鍵思想是將葉子節(jié)點和組合節(jié)點都視為相同類型的對象,它們都實現(xiàn)了相同的接口,從而客戶端可以一致地處理它們。

組合模式的主要優(yōu)點包括:

  1. 簡化客戶端代碼:客戶端不需要區(qū)分葉子節(jié)點和組合節(jié)點,可以統(tǒng)一處理。
  2. 支持嵌套結(jié)構(gòu):可以輕松創(chuàng)建包含多層次嵌套的樹狀結(jié)構(gòu)。
  3. 提供了高擴展性:可以輕松地添加新的葉子節(jié)點或組合節(jié)點,而不會影響現(xiàn)有代碼。

總之,組合模式允許你創(chuàng)建具有靈活結(jié)構(gòu)的對象樹,從而更容易地管理和操作對象的層次結(jié)構(gòu)。

2. 使用的場景

組合模式通常適用于以下場景:

  1. 層次結(jié)構(gòu)對象:當你需要表示對象的層次結(jié)構(gòu),其中對象可以是單個元素或包含其他對象的容器時,組合模式非常有用。例如,文件系統(tǒng)中的文件和文件夾,圖形用戶界面中的窗口和控件,組織結(jié)構(gòu)中的部門和員工等。
  2. 統(tǒng)一處理:當你希望客戶端代碼能夠統(tǒng)一處理單個對象和組合對象時,組合模式是一種有用的方式??蛻舳瞬恍枰P(guān)心它們處理的是葉子節(jié)點還是組合節(jié)點。
  3. 遞歸結(jié)構(gòu):當對象之間存在遞歸關(guān)系,且你希望以一種統(tǒng)一的方式遍歷和操作整個結(jié)構(gòu)時,組合模式非常適合。例如,在解析樹、XML文檔、目錄結(jié)構(gòu)等場景中。
  4. 添加新組件類型:當你需要在不修改現(xiàn)有代碼的情況下添加新的組件類型時,組合模式是一種非常靈活的設(shè)計。你只需要創(chuàng)建新的葉子節(jié)點或組合節(jié)點,并確保它們實現(xiàn)了相同的接口。
  5. 操作整體和部分:當你需要對整體和部分進行一致性操作時,組合模式非常有用。例如,對于圖形界面中的窗口和其中的所有控件,你可以同時執(zhí)行操作,而不需要單獨處理每個控件。

總之,組合模式適用于那些具有層次結(jié)構(gòu)、需要統(tǒng)一處理、具有遞歸關(guān)系或需要支持動態(tài)添加新組件類型的情況。它有助于簡化復(fù)雜結(jié)構(gòu)的管理和操作,提高代碼的可維護性和擴展性。

3. 應(yīng)用例子

以下是一個使用 Python 實現(xiàn)的組合模式示例,模擬了文件系統(tǒng)的層次結(jié)構(gòu):

from abc import ABC, abstractmethod

# 抽象組件類
class FileSystemComponent(ABC):
    @abstractmethod
    def display(self):
        pass

# 葉子節(jié)點類 - 文件
class File(FileSystemComponent):
    def __init__(self, name):
        self.name = name

    def display(self):
        print(f"File: {self.name}")

# 組合節(jié)點類 - 文件夾
class Folder(FileSystemComponent):
    def __init__(self, name):
        self.name = name
        self.children = []

    def add(self, component):
        self.children.append(component)

    def remove(self, component):
        self.children.remove(component)

    def display(self):
        print(f"Folder: {self.name}")
        for child in self.children:
            child.display()

# 客戶端代碼
if __name__ == "__main__":
    root = Folder("Root")
    file1 = File("File 1")
    file2 = File("File 2")
    folder1 = Folder("Folder 1")
    file3 = File("File 3")

    root.add(file1)
    root.add(file2)
    root.add(folder1)
    folder1.add(file3)

    root.display()

在這個示例中,我們有兩種類型的節(jié)點:File 表示葉子節(jié)點(文件),F(xiàn)older 表示組合節(jié)點(文件夾)。它們都實現(xiàn)了 FileSystemComponent 抽象類,其中包括 display 方法以顯示節(jié)點的信息。

客戶端代碼創(chuàng)建了一個包含文件和文件夾的層次結(jié)構(gòu),并使用 display 方法遍歷并顯示整個文件系統(tǒng)結(jié)構(gòu)。這個示例演示了組合模式的核心概念,即葉子節(jié)點和組合節(jié)點具有相同的接口,并且客戶端可以一致地處理它們。

4. 實現(xiàn)要素

組合模式的主要要素包括以下部分:

  1. Component(組件):這是一個抽象類或接口,定義了葉子節(jié)點和組合節(jié)點的公共接口。它通常包括了一些操作,例如操作葉子節(jié)點或組合節(jié)點的方法。
  2. Leaf(葉子節(jié)點):這是組合中的基本對象,它實現(xiàn)了 Component 接口。葉子節(jié)點不能包含其他對象,通常執(zhí)行具體的操作。
  3. Composite(組合節(jié)點):這是包含子對象的復(fù)雜對象,也實現(xiàn)了 Component 接口。組合節(jié)點執(zhí)行某些操作,然后將操作傳遞給其子節(jié)點。組合節(jié)點可以包含葉子節(jié)點或其他組合節(jié)點,從而創(chuàng)建層次結(jié)構(gòu)。

5. UML圖

下面是組合模式的簡化 UML 類圖:

         +-------------------------+
         |        Component        |
         +-------------------------+
         | + operation()           |
         +-------------------------+
                 /       \
                /         \
               /           \
              /             \
 +----------------+   +----------------+
 |     Leaf       |   |    Composite   |
 +----------------+   +----------------+
 |                |   |                |
 +----------------+   +----------------+

在這個 UML 類圖中,Component 定義了操作,Leaf 和 Composite 都實現(xiàn)了 Component 接口。Leaf 表示葉子節(jié)點,Composite 表示組合節(jié)點。
組合模式的關(guān)鍵思想是使葉子節(jié)點和組合節(jié)點具有相同的接口,以便客戶端可以一致地處理它們。這種統(tǒng)一性使得組合模式能夠處理具有層次結(jié)構(gòu)的對象,而不需要客戶端關(guān)心對象的類型。

6. Java/golang/javascrip/C++ 等語言實現(xiàn)方式

6.1 Java實現(xiàn)

上述例子用Java語言實現(xiàn)示例如下:

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

// 抽象組件類
abstract class FileSystemComponent {
    abstract void display();
}

// 葉子節(jié)點類 - 文件
class File extends FileSystemComponent {
    private String name;

    public File(String name) {
        this.name = name;
    }

    @Override
    void display() {
        System.out.println("File: " + name);
    }
}

// 組合節(jié)點類 - 文件夾
class Folder extends FileSystemComponent {
    private String name;
    private List<FileSystemComponent> children = new ArrayList<>();

    public Folder(String name) {
        this.name = name;
    }

    public void add(FileSystemComponent component) {
        children.add(component);
    }

    public void remove(FileSystemComponent component) {
        children.remove(component);
    }

    @Override
    void display() {
        System.out.println("Folder: " + name);
        for (FileSystemComponent child : children) {
            child.display();
        }
    }
}

// 客戶端代碼
public class Main {
    public static void main(String[] args) {
        Folder root = new Folder("Root");
        File file1 = new File("File 1");
        File file2 = new File("File 2");
        Folder folder1 = new Folder("Folder 1");
        File file3 = new File("File 3");

        root.add(file1);
        root.add(file2);
        root.add(folder1);
        folder1.add(file3);

        root.display();
    }
}

6.2 Golang實現(xiàn)

上述例子用golang實現(xiàn)示例如下:

package main

import "fmt"

// 抽象組件接口
type FileSystemComponent interface {
    Display()
}

// 葉子節(jié)點類 - 文件
type File struct {
    name string
}

func NewFile(name string) *File {
    return &File{name}
}

func (f *File) Display() {
    fmt.Printf("File: %s\n", f.name)
}

// 組合節(jié)點類 - 文件夾
type Folder struct {
    name     string
    children []FileSystemComponent
}

func NewFolder(name string) *Folder {
    return &Folder{name, make([]FileSystemComponent, 0)}
}

func (d *Folder) Add(component FileSystemComponent) {
    d.children = append(d.children, component)
}

func (d *Folder) Remove(component FileSystemComponent) {
    for i, c := range d.children {
        if c == component {
            d.children = append(d.children[:i], d.children[i+1:]...)
            return
        }
    }
}

func (d *Folder) Display() {
    fmt.Printf("Folder: %s\n", d.name)
    for _, c := range d.children {
        c.Display()
    }
}

func main() {
    root := NewFolder("Root")
    file1 := NewFile("File 1")
    file2 := NewFile("File 2")
    folder1 := NewFolder("Folder 1")
    file3 := NewFile("File 3")

    root.Add(file1)
    root.Add(file2)
    root.Add(folder1)
    folder1.Add(file3)

    root.Display()
}

6.3 Javascript實現(xiàn)

上述例子用javascript實現(xiàn)示例如下:

// 抽象組件類
class FileSystemComponent {
    display() {}
}

// 葉子節(jié)點類 - 文件
class File extends FileSystemComponent {
    constructor(name) {
        super();
        this.name = name;
    }

    display() {
        console.log(`File: ${this.name}`);
    }
}

// 組合節(jié)點類 - 文件夾
class Folder extends FileSystemComponent {
    constructor(name) {
        super();
        this.name = name;
        this.children = [];
    }

    add(component) {
        this.children.push(component);
    }

    remove(component) {
        this.children = this.children.filter(child => child !== component);
    }

    display() {
        console.log(`Folder: ${this.name}`);
        for (const child of this.children) {
            child.display();
        }
    }
}

// 客戶端代碼
const root = new Folder("Root");
const file1 = new File("File 1");
const file2 = new File("File 2");
const folder1 = new Folder("Folder 1");
const file3 = new File("File 3");

root.add(file1);
root.add(file2);
root.add(folder1);
folder1.add(file3);

root.display();

6.4 C++實現(xiàn)

上述例子用C++實現(xiàn)如下:

#include <iostream>
#include <vector>

// 抽象組件類
class FileSystemComponent {
public:
    virtual void display() = 0;
};

// 葉子節(jié)點類 - 文件
class File : public FileSystemComponent {
private:
    std::string name;

public:
    File(const std::string& name) : name(name) {}

    void display() override {
        std::cout << "File: " << name << std::endl;
    }
};

// 組合節(jié)點類 - 文件夾
class Folder : public FileSystemComponent {
private:
    std::string name;
    std::vector<FileSystemComponent*> children;

public:
    Folder(const std::string& name) : name(name) {}

    void add(FileSystemComponent* component) {
        children.push_back(component);
    }

    void remove(FileSystemComponent* component) {
        for (auto it = children.begin(); it != children.end(); ++it) {
            if (*it == component) {
                children.erase(it);
                break;
            }
        }
    }

    void display() override {
        std::cout << "Folder: " << name << std::endl;
        for (auto child : children) {
            child->display();
        }
    }
};

int main() {
    Folder root("Root");
    File file1("File 1");
    File file2("File 2");
    Folder folder1("Folder 1");
    File file3("File 3");

    root.add(&file1);
    root.add(&file2);
    root.add(&folder1);
    folder1.add(&file3);

    root.display();

    return 0;
}

7. 練習題

在一個文件系統(tǒng)中,有文件和文件夾兩種類型的元素。文件是葉子節(jié)點,而文件夾是組合節(jié)點。使用組合模式來建模這個文件系統(tǒng)。

要求:

  1. 創(chuàng)建一個抽象組件類 FileSystemComponent,其中包括一個抽象方法 display()。
  2. 創(chuàng)建一個葉子節(jié)點類 File,它繼承自 FileSystemComponent,包括一個屬性 name 表示文件名,并實現(xiàn) display() 方法以顯示文件名。
  3. 創(chuàng)建一個組合節(jié)點類 Folder,它繼承自 FileSystemComponent,包括一個屬性 name 表示文件夾名,以及一個保存子元素的容器,實現(xiàn) add() 和 remove() 方法來添加和移除子元素,并實現(xiàn) display() 方法以顯示文件夾名以及其中的子元素。
  4. 在客戶端代碼中創(chuàng)建一個文件系統(tǒng)層次結(jié)構(gòu),包括文件和文件夾,然后使用 display() 方法顯示整個文件系統(tǒng)結(jié)構(gòu)。

你可以使用 C++、Java、Python 或任何其他編程語言來實現(xiàn)這個練習。
你可以在評論區(qū)里或者私信我回復(fù)您的答案,這樣我或者大家都能幫你解答,期待著你的回復(fù)~文章來源地址http://www.zghlxwxcb.cn/news/detail-728663.html

到了這里,關(guān)于設(shè)計模式——10. 組合模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java23種設(shè)計模式-結(jié)構(gòu)型模式之組合模式

    組合模式 (Composite Pattern):將 對象組合成樹狀結(jié)構(gòu) 以表示“ 部分-整體 ”層次結(jié)構(gòu),同時保持對單個對象和組合對象的一致性操作,主要目的是簡化客戶端代碼,因為它可以統(tǒng)一處理單個對象和組合對象。 通常包含以下幾個角色: 角色1. 抽象組件 (Component):聲明了 組

    2024年04月26日
    瀏覽(29)
  • 【Design Pattern 23種經(jīng)典設(shè)計模式源碼大全】C/Java/Go/JS/Python/TS等不同語言實現(xiàn)

    【Design Pattern 23種經(jīng)典設(shè)計模式源碼大全】C/Java/Go/JS/Python/TS等不同語言實現(xiàn)

    經(jīng)典設(shè)計模式源碼詳解,用不同語言來實現(xiàn),包括Java/JS/Python/TypeScript/Go等。結(jié)合實際場景,充分注釋說明,每一行代碼都經(jīng)過檢驗,確保可靠。 設(shè)計模式是一個程序員進階高級的必然選擇,不懂設(shè)計模式,就像寫文章不懂得層次,蓋房子沒有結(jié)構(gòu)。只有充分懂得設(shè)計之道,

    2023年04月11日
    瀏覽(24)
  • Java設(shè)計模式之結(jié)構(gòu)型-組合模式(UML類圖+案例分析)

    Java設(shè)計模式之結(jié)構(gòu)型-組合模式(UML類圖+案例分析)

    目錄 一、基礎(chǔ)概念 二、UML類圖 三、角色設(shè)計 四、案例分析 4.1、基本實現(xiàn) 4.2、菜單遍歷? 五、總結(jié)? 組合模式(Composite Pattern)又叫部分-整體模式,它通過將對象組合成樹形結(jié)構(gòu)來表示“整體-部分”的層次關(guān)系,允許用戶統(tǒng)一單個對象和組合對象的處理邏輯。 角色 描述

    2024年02月16日
    瀏覽(25)
  • 【設(shè)計模式——學習筆記】23種設(shè)計模式——組合模式Composite(原理講解+應(yīng)用場景介紹+案例介紹+Java代碼實現(xiàn))

    【設(shè)計模式——學習筆記】23種設(shè)計模式——組合模式Composite(原理講解+應(yīng)用場景介紹+案例介紹+Java代碼實現(xiàn))

    編寫程序展示一個學校院系結(jié)構(gòu): 需求是這樣,要在一個頁面中展示出學校的院系組成,一個學校有多個學院,一個學院有多個系 【傳統(tǒng)方式】 將學院看做是學校的子類,系是學院的子類,小的組織繼承大的組織 分析: 在一個頁面中展示出學校的院系組成,一個學校有多個

    2024年02月15日
    瀏覽(32)
  • 【Java面試題】設(shè)計模式之七種結(jié)構(gòu)性模式——代理模式、適配器模式、橋接模式、裝飾模式、外觀模式、享元模式、組合模式

    目錄 一、代理模式 二、適配器模式 三、橋接模式 四、裝飾模式 五、外觀模式 六、享元模式 七、組合模式 概念: 代理模式是為其他對象提供一種以代理控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對

    2023年04月09日
    瀏覽(26)
  • Python入門【?編輯、組合、設(shè)計模式_工廠模式實現(xiàn) 、設(shè)計模式_單例模式實現(xiàn)、工廠和單例模式結(jié)合、異常是什么?異常的解決思路 】(十七)

    Python入門【?編輯、組合、設(shè)計模式_工廠模式實現(xiàn) 、設(shè)計模式_單例模式實現(xiàn)、工廠和單例模式結(jié)合、異常是什么?異常的解決思路 】(十七)

    ??作者簡介:大家好,我是愛敲代碼的小王,CSDN博客博主,Python小白 ??系列專欄:python入門到實戰(zhàn)、Python爬蟲開發(fā)、Python辦公自動化、Python數(shù)據(jù)分析、Python前后端開發(fā) ??如果文章知識點有錯誤的地方,請指正!和大家一起學習,一起進步?? ??如果感覺博主的文章還不錯的

    2024年02月14日
    瀏覽(20)
  • 10.python設(shè)計模式【代理模式】

    10.python設(shè)計模式【代理模式】

    內(nèi)容:為其他對象提供一種代理一控制對這個對象的訪問 應(yīng)用場景: 遠程代理: 為遠程的對象提供代理 虛代理:根據(jù)需要創(chuàng)建很大的對象 保護代理:控制對原始對象的訪問,用于對象有不同訪問權(quán)限時 UML圖 舉個例子: 需求:完成一個文件讀取和寫入,完成遠程代理、需

    2024年02月15日
    瀏覽(20)
  • 設(shè)計模式——組合模式08

    設(shè)計模式——組合模式08

    組合模式:把類似對象或方法組合成結(jié)構(gòu)為樹狀的設(shè)計思路。 例如部門之間的關(guān)系。 設(shè)計模式,一定要敲代碼理解 滿足開閉原則。葉子結(jié)點與非葉子結(jié)點都繼承或?qū)崿F(xiàn)同一抽象,只是葉子功能權(quán)限少,而非葉子結(jié)點需要容器記錄子節(jié)點。 代碼下載

    2024年04月11日
    瀏覽(27)
  • 設(shè)計模式——組合模式

    設(shè)計模式——組合模式

    組合模式(Composite Pattern):組合多個對象形成樹形結(jié)構(gòu)以表示具有“整體—部分”關(guān)系的層次結(jié)構(gòu)。組合模式對單個對象(即葉子對象)和組合對象(即容器對象)的使用具有一致性,組合模式又可以稱為“整體—部分”(Part-Whole)模式,它是一種對象結(jié)構(gòu)型模式。 組合模式將

    2024年02月11日
    瀏覽(33)
  • 設(shè)計模式-組合模式

    設(shè)計模式-組合模式

    組合模式可以使用一棵樹來表示 組合模式使得用戶可以使用一致的方法操作單個對象和組合對象 組合模式又叫部分整體模式,將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),可以更好的實現(xiàn)管理操作,部分-整體對象的操作基本一樣,但是應(yīng)該還會有不一樣的地方

    2024年02月10日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包