高清视频在线观看免费播放器-伊人日本-色九月综合-18禁止看的免费污网站-免费观看性行为视频的网站-天天碰天天操-久久精品国产欧美日韩99热-中文字幕在线视频不卡-国产偷人妻精品一区二区在线-国内精品久-伊人影院在线看-密臀av一区-久久综合五月丁香久久激情-福利一区福利二区-gg国产精品国内免费观看-国产精品 高清 尿 小便 嘘嘘

當(dāng)前位置: 首頁 >快訊 > 正文

組合模式詳解 環(huán)球關(guān)注

2023-06-27 02:52:30 來源:博客園
簡介

組合模式(Composite)是針對由多個節(jié)點(diǎn)對象(部分)組成的樹形結(jié)構(gòu)的對象(整體)而發(fā)展出的一種結(jié)構(gòu)型設(shè)計模式,它能夠使客戶端在操作整體對象或者其下的每個節(jié)點(diǎn)對象時做出統(tǒng)一的響應(yīng),保證樹形結(jié)構(gòu)對象使用方法的一致性,使客戶端不必關(guān)注對象的整體或部分,最終達(dá)到對象復(fù)雜的層次結(jié)構(gòu)與客戶端解耦的目的。

組合模式的核心思想是將對象看作是一個樹形結(jié)構(gòu),其中每個節(jié)點(diǎn)可以是一個單獨(dú)的對象(葉子節(jié)點(diǎn))或者一個包含其他節(jié)點(diǎn)的容器(組合節(jié)點(diǎn))。葉子節(jié)點(diǎn)和組合節(jié)點(diǎn)都實(shí)現(xiàn)了相同的接口,這樣客戶端就可以對它們進(jìn)行一致的操作,而不需要關(guān)心它們的具體類型。


(資料圖片僅供參考)

組合模式有以下幾個角色:

Component(組件接口):所有復(fù)合節(jié)點(diǎn)與葉節(jié)點(diǎn)的高層抽象,定義出需要對組件操作的接口標(biāo)準(zhǔn)。對應(yīng)本章例程中的抽象節(jié)點(diǎn)類,具體使用接口還是抽象類需根據(jù)具體場景而定。Composite(復(fù)合組件):包含多個子組件對象(可以是復(fù)合組件或葉端組件)的復(fù)合型組件,并實(shí)現(xiàn)組件接口中定義的操作方法。對應(yīng)本章例程中作為“根節(jié)點(diǎn)/枝節(jié)點(diǎn)”的文件夾類。Leaf(葉端組件):不包含子組件的終端組件,同樣實(shí)現(xiàn)組件接口中定義的操作方法。對應(yīng)本章例程中作為“葉節(jié)點(diǎn)”的文件類。Client(客戶端):按所需的層級關(guān)系部署相關(guān)對象并操作組件接口所定義的接口,即可遍歷樹結(jié)構(gòu)上的所有組件。好處和壞處

組合模式的好處有:

可以將對象組合成樹形結(jié)構(gòu),表示整體-部分的層次關(guān)系,符合人們的直覺。可以統(tǒng)一處理單個對象和對象組合,簡化了客戶端的代碼邏輯,提高了系統(tǒng)的可復(fù)用性。可以遵循開閉原則,擴(kuò)展性高,增加新的節(jié)點(diǎn)類型時不需要修改原有代碼。

組合模式的壞處有:

可以使設(shè)計變得過于抽象,不利于理解和維護(hù)。可以違反單一職責(zé)原則,讓葉子節(jié)點(diǎn)和組合節(jié)點(diǎn)具有相同的接口,導(dǎo)致葉子節(jié)點(diǎn)出現(xiàn)不必要的方法。可以導(dǎo)致遞歸調(diào)用過深,影響系統(tǒng)的性能。應(yīng)用場景

組合模式是一種將對象組合成樹形結(jié)構(gòu)的設(shè)計模式,它可以表示整體-部分的層次關(guān)系,并且提供了一致的接口來操作單個對象和對象組合。應(yīng)用場景有:

當(dāng)需要表示一個對象整體與部分的層次結(jié)構(gòu)時,可以使用組合模式來實(shí)現(xiàn)樹形結(jié)構(gòu)。例如,文件系統(tǒng)中的文件與文件夾、組織機(jī)構(gòu)中的部門與員工、商品分類中的類別與商品等。當(dāng)需要統(tǒng)一處理單個對象和對象組合時,可以使用組合模式來實(shí)現(xiàn)多態(tài)性。例如,圖形界面中的簡單控件與容器控件、菜單系統(tǒng)中的菜單項(xiàng)與子菜單、報表系統(tǒng)中的單元格與表格等。當(dāng)需要將對象的創(chuàng)建和使用分離時,可以使用組合模式來實(shí)現(xiàn)依賴注入。例如,Spring框架中的Bean對象與BeanFactory對象、測試框架中的測試用例與測試套件等。Java 代碼示例

假設(shè)我們有一個文件系統(tǒng),其中有兩種類型的文件:文本文件和文件夾。文本文件是葉子節(jié)點(diǎn),文件夾是組合節(jié)點(diǎn),可以包含其他文件。我們想要使用組合模式來實(shí)現(xiàn)文件系統(tǒng)的層次結(jié)構(gòu),并且提供一個打印文件路徑的方法。代碼如下:

定義抽象組件

public interface File {    // 獲取文件名稱    String getName();    // 添加子文件    void add(File file);    // 刪除子文件    void remove(File file);    // 獲取子文件    List getChildren();    // 打印文件路徑    void printPath(int space);}

定義葉子節(jié)點(diǎn)

public class TextFile implements File {    private String name;    public TextFile(String name) {        this.name = name;    }    @Override    public String getName() {        return name;    }    @Override    public void add(File file) {        throw new UnsupportedOperationException("Text file cannot add child file");    }    @Override    public void remove(File file) {        throw new UnsupportedOperationException("Text file cannot remove child file");    }    @Override    public List getChildren() {        throw new UnsupportedOperationException("Text file has no child file");    }    @Override    public void printPath(int space) {        StringBuilder sp = new StringBuilder();        for (int i = 0; i < space; i++) {            sp.append(" ");        }        System.out.println(sp + name);    }}

定義組合節(jié)點(diǎn)

public class Folder implements File {    private String name;    private List children;    public Folder(String name) {        this.name = name;        children = new ArrayList<>();    }    @Override    public String getName() {        return name;    }    @Override    public void add(File file) {        children.add(file);    }    @Override    public void remove(File file) {        children.remove(file);    }    @Override    public List getChildren() {        return children;    }    @Override    public void printPath(int space) {        StringBuilder sp = new StringBuilder();        for (int i = 0; i < space; i++) {            sp.append(" ");        }        System.out.println(sp + name);        space += 2;        for (File child : children) {            child.printPath(space);        }    }}

客戶端代碼

public class Client {    public static void main(String[] args) {        // 創(chuàng)建一個根文件夾,并添加兩個文本文件和一個子文件夾        File root = new Folder("root");        root.add(new TextFile("a.txt"));        root.add(new TextFile("b.txt"));        File subFolder = new Folder("subFolder");        root.add(subFolder);        // 在子文件夾中添加兩個文本文件        subFolder.add(new TextFile("c.txt"));        subFolder.add(new TextFile("d.txt"));        // 打印根文件夾的路徑        root.printPath(0);    }}

輸出結(jié)果:

root  a.txt  b.txt  subFolder    c.txt    d.txt
Go 代碼示例
package main// importing fmt packageimport ("fmt")// IComposite interfacetype IComposite interface {perform()}// Leaflet structtype Leaflet struct {name string}// Leaflet class method performfunc (leaf *Leaflet) perform() {fmt.Println("Leaflet " + leaf.name)}// Branch structtype Branch struct {leafs    []Leafletname     stringbranches []Branch}// Branch class method performfunc (branch *Branch) perform() {fmt.Println("Branch: " + branch.name)for _, leaf := range branch.leafs {leaf.perform()}for _, branch := range branch.branches {branch.perform()}}// Branch class method add leafletfunc (branch *Branch) add(leaf Leaflet) {branch.leafs = append(branch.leafs, leaf)}//Branch class method addBranch branchfunc (branch *Branch) addBranch(newBranch Branch) {branch.branches = append(branch.branches, newBranch)}//Branch class  method getLeafletsfunc (branch *Branch) getLeaflets() []Leaflet {return branch.leafs}// main methodfunc main() {var branch = &Branch{name: "branch 1"}var leaf1 = Leaflet{name: "leaf 1"}var leaf2 = Leaflet{name: "leaf 2"}var branch2 = Branch{name: "branch 2"}branch.add(leaf1)branch.add(leaf2)branch.addBranch(branch2)branch.perform()}

輸出結(jié)果:

G:\GoLang\examples>go run composite.goBranch: branch 1Leaflet leaf 1Leaflet leaf 2Branch: branch 2
Spring 代碼示例

Spring 框架也可以使用組合模式來實(shí)現(xiàn)對象的層次結(jié)構(gòu),它提供了一個注解叫做 @Component,它可以用來標(biāo)注一個類是一個組件,即一個可被Spring管理的Bean對象。@Component注解有一個屬性叫做value,它可以用來指定組件的名稱。我們可以使用 @Component注解來標(biāo)注我們的文件類,然后在配置文件或注解中聲明這些組件,Spring 就會自動創(chuàng)建和管理這些組件對象。

假設(shè)我們有一個文件系統(tǒng),其中有兩種類型的文件:文本文件和文件夾。文本文件是葉子節(jié)點(diǎn),文件夾是組合節(jié)點(diǎn),可以包含其他文件。我們想要使用組合模式來實(shí)現(xiàn)文件系統(tǒng)的層次結(jié)構(gòu),并且提供一個打印文件路徑的方法。我們可以使用 @Component注解來實(shí)現(xiàn),代碼如下:

抽象組件不用改造

public interface File {    // 獲取文件名稱    String getName();    // 添加子文件    void add(File file);    // 刪除子文件    void remove(File file);    // 獲取子文件    List getChildren();    // 打印文件路徑    void printPath();}

葉子節(jié)點(diǎn)添加 @Component("a.txt")注解

@Component("a.txt")public class TextFile implements File {    private String name;    public TextFile() {        this.name = "a.txt";    }    @Override    public String getName() {        return name;    }    @Override    public void add(File file) {        throw new UnsupportedOperationException("Text file cannot add child file");    }    @Override    public void remove(File file) {        throw new UnsupportedOperationException("Text file cannot remove child file");    }    @Override    public List getChildren() {        throw new UnsupportedOperationException("Text file has no child file");    }    @Override    public void printPath() {        System.out.println(name);    }}

組合節(jié)點(diǎn)添加 @Component("root")注解

@Component("root")public class Folder implements File {    private String name;    private List children;    // 通過@Autowired注解自動注入所有類型為File的Bean對象到children集合中    @Autowired    public Folder(List children) {        this.name = "root";        this.children = children;    }    @Override    public String getName() {        return name;    }    @Override    public void add(File file) {        children.add(file);    }    @Override    public void remove(File file) {        children.remove(file);    }    @Override    public List getChildren() {        return children;    }    @Override    public void printPath() {        System.out.println(name);        for (File child : children) {            child.printPath();        }    }}

SpringBoot 測試代碼

@Slf4j@SpringBootTestclass SpringBootTest {    @Autowired    private Folder folder;    @Test    void test() {        folder.printPath();    }}

輸出結(jié)果:

roota.txt
總結(jié)

組合模式是一種常用的結(jié)構(gòu)型設(shè)計模式,它可以將對象組合成樹形結(jié)構(gòu),并且提供了一致的接口來操作單個對象和對象組合,是一種值得學(xué)習(xí)和掌握的設(shè)計模式。

關(guān)注公眾號【waynblog】每周分享技術(shù)干貨、開源項(xiàng)目、實(shí)戰(zhàn)經(jīng)驗(yàn)、高效開發(fā)工具等,您的關(guān)注將是我的更新動力!

標(biāo)簽:

返回頂部
高清视频在线观看免费播放器-伊人日本-色九月综合-18禁止看的免费污网站-免费观看性行为视频的网站-天天碰天天操-久久精品国产欧美日韩99热-中文字幕在线视频不卡-国产偷人妻精品一区二区在线-国内精品久-伊人影院在线看-密臀av一区-久久综合五月丁香久久激情-福利一区福利二区-gg国产精品国内免费观看-国产精品 高清 尿 小便 嘘嘘
  • <cite id="ecweg"><pre id="ecweg"></pre></cite>
    <rt id="ecweg"><acronym id="ecweg"></acronym></rt>
  • <rt id="ecweg"></rt>
    久久艹国产精品| 可以在线看的av网站| 亚洲美免无码中文字幕在线| 免费国产成人看片在线| 日韩欧美中文视频| 中文字幕日韩久久| 亚洲av首页在线| www.黄色网址.com| 免费看日b视频| 人妻av无码专区| 日本日本19xxxⅹhd乱影响| 国产精品999视频| 一级在线免费视频| 99999精品| 日韩精品视频在线观看视频| 欧美黑人经典片免费观看| 99色精品视频| 亚洲综合婷婷久久| 国产树林野战在线播放| 霍思燕三级露全乳照| 欧美精品成人网| 久久精品一卡二卡| 成年人网站国产| 538任你躁在线精品免费| 五月天综合婷婷| 日韩网址在线观看| 中文字幕日韩久久| 欧美性大战久久久久xxx| 日本高清久久久| 日本xxxxxxxxxx75| 日韩欧美中文在线视频| 欧美精品自拍视频| 亚洲精品国产久| 日本黄网站免费| www.欧美黄色| 波多野结衣免费观看| 精品中文字幕av| 干日本少妇视频| 一路向西2在线观看| 男人的天堂狠狠干| 香蕉精品视频在线| 国产成人手机视频| 少妇高潮毛片色欲ava片| 亚洲精品mv在线观看| 成人性生生活性生交12| 久久久久久www| 成人免费在线视频播放| 国产探花在线看| 999精彩视频| 一本色道无码道dvd在线观看| 狠狠精品干练久久久无码中文字幕 | 五十路熟女丰满大屁股| xx欧美撒尿嘘撒尿xx| 精品人妻一区二区三区四区在线 | 日韩一区二区高清视频| www.久久com| 亚洲欧美一区二区三区不卡| 欧美性猛交久久久乱大交小说 | 你懂的av在线| 手机免费av片| 可以在线看的黄色网址| 男人添女荫道口女人有什么感觉| www.亚洲高清| 九热视频在线观看| 妺妺窝人体色www在线观看| 久久黄色片视频| www.99热这里只有精品| 成人一区二区免费视频| 免费成人在线视频网站| 国产精品50p| 无码内射中文字幕岛国片| avav在线看| 国产高清视频网站| 日韩不卡的av| 最新中文字幕久久| 17c丨国产丨精品视频| www.国产在线播放| 久久国产成人精品国产成人亚洲 | 免费日韩中文字幕| 亚洲黄色a v| 黄色www在线观看| 131美女爱做视频| 亚洲黄色av网址| 成人性做爰片免费视频| 成人一区二区免费视频| 久草福利视频在线| 蜜桃视频成人在线观看| 精品视频免费在线播放| 永久免费的av网站| 大胆欧美熟妇xx| 欧美精品性生活| 欧美大黑帍在线播放| 亚洲精品中文字幕无码蜜桃| 看看黄色一级片| 欧美精品久久久久久久久久久| 妓院一钑片免看黄大片| 国产免费一区二区三区四在线播放| 激情小视频网站| 亚洲精品mv在线观看| 免费成人在线视频网站| 在线视频观看91| 久久美女福利视频| 欧妇女乱妇女乱视频| 波多野结衣xxxx| 777精品久无码人妻蜜桃| 亚洲午夜精品一区| 国产男女无遮挡| 欧美午夜性视频| 超碰在线超碰在线| 小明看看成人免费视频| 欧美日韩第二页| 日韩黄色短视频| 国风产精品一区二区| 中文字幕国产免费| 免费激情视频在线观看| 国产96在线 | 亚洲| 裸体大乳女做爰69| 中文字幕亚洲影院| 日本黄色的视频| 91国产精品视频在线观看| 青青青在线视频播放| 在线观看17c| 妞干网这里只有精品| 亚洲高清av一区二区三区| 久久久久久蜜桃一区二区| 99视频在线免费| 看欧美ab黄色大片视频免费| 中文字幕乱码人妻综合二区三区| 日本欧美黄色片| 成年人视频网站免费观看| 国产91xxx| 国产精品333| 成年人小视频网站| 午夜免费福利在线| gai在线观看免费高清| 国产亚洲视频一区| 一级片免费在线观看视频| 7777在线视频| 99在线免费视频观看| 亚洲人精品午夜射精日韩| 成人观看免费完整观看| 波多野结衣天堂| 日韩成人精品视频在线观看| 免费成人进口网站| 亚洲熟妇无码一区二区三区| 国产精品va无码一区二区| 中文字幕无码不卡免费视频| av网站在线不卡| 国内自拍中文字幕| 激情六月丁香婷婷| wwwwwxxxx日本| 日本aa在线观看| 九九热免费精品视频| 无码毛片aaa在线| 亚洲欧洲日产国码无码久久99| 国产视频一区二区视频| 男插女免费视频| 黑森林福利视频导航| 男女视频在线观看网站| 国产日韩欧美精品在线观看| 国产真人无码作爱视频免费| 日韩av加勒比| 成人在线免费观看av| 奇米777在线视频| 日韩毛片在线免费看| 乱子伦一区二区| 亚洲欧美自拍另类日韩| 久久亚洲精品无码va白人极品| 亚洲免费看av| 久色视频在线播放| 黄瓜视频免费观看在线观看www| 日韩a∨精品日韩在线观看| 奇米影视四色在线| 免费观看美女裸体网站| 超碰免费在线公开| 中日韩av在线播放| 六月丁香激情网| 成人毛片100部免费看| 中文字幕av专区| 成人免费无码av| 欧美老熟妇喷水| 亚洲中文字幕无码一区二区三区 | 一级黄色录像免费看| 婷婷六月天在线| 超碰影院在线观看| 国产免费观看高清视频| 欧美日韩dvd| 日本成人性视频| 国产精品美女在线播放| 九九热99视频| 精品亚洲一区二区三区四区| 色婷婷综合久久久久中文字幕| 精品成在人线av无码免费看| 午夜啪啪福利视频| 青春草在线视频免费观看| xxxx在线免费观看| 三区视频在线观看| 91视频这里只有精品| 中文字幕视频三区| 亚洲自拍第三页|