久久久精品视频在线_免费在线a视频_在线看的黄色网址_懂色av粉嫩av浪潮av_艳妇乳肉豪妇荡乳av_国产午夜大地久久_国产在线观看免费播放_天堂视频免费看_久久精品女同亚洲女同13_各处沟厕大尺度偷拍女厕嘘嘘

當前位置: 首頁 >快訊 > 正文

組合模式詳解 環球關注

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

組合模式(Composite)是針對由多個節點對象(部分)組成的樹形結構的對象(整體)而發展出的一種結構型設計模式,它能夠使客戶端在操作整體對象或者其下的每個節點對象時做出統一的響應,保證樹形結構對象使用方法的一致性,使客戶端不必關注對象的整體或部分,最終達到對象復雜的層次結構與客戶端解耦的目的。

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


(資料圖片僅供參考)

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

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

組合模式的好處有:

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

組合模式的壞處有:

可以使設計變得過于抽象,不利于理解和維護。可以違反單一職責原則,讓葉子節點和組合節點具有相同的接口,導致葉子節點出現不必要的方法。可以導致遞歸調用過深,影響系統的性能。應用場景

組合模式是一種將對象組合成樹形結構的設計模式,它可以表示整體-部分的層次關系,并且提供了一致的接口來操作單個對象和對象組合。應用場景有:

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

假設我們有一個文件系統,其中有兩種類型的文件:文本文件和文件夾。文本文件是葉子節點,文件夾是組合節點,可以包含其他文件。我們想要使用組合模式來實現文件系統的層次結構,并且提供一個打印文件路徑的方法。代碼如下:

定義抽象組件

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

定義葉子節點

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);    }}

定義組合節點

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) {        // 創建一個根文件夾,并添加兩個文本文件和一個子文件夾        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);    }}

輸出結果:

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()}

輸出結果:

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

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

假設我們有一個文件系統,其中有兩種類型的文件:文本文件和文件夾。文本文件是葉子節點,文件夾是組合節點,可以包含其他文件。我們想要使用組合模式來實現文件系統的層次結構,并且提供一個打印文件路徑的方法。我們可以使用 @Component注解來實現,代碼如下:

抽象組件不用改造

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

葉子節點添加 @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);    }}

組合節點添加 @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();    }}

輸出結果:

roota.txt
總結

組合模式是一種常用的結構型設計模式,它可以將對象組合成樹形結構,并且提供了一致的接口來操作單個對象和對象組合,是一種值得學習和掌握的設計模式。

關注公眾號【waynblog】每周分享技術干貨、開源項目、實戰經驗、高效開發工具等,您的關注將是我的更新動力!

標簽:

返回頂部
亚欧激情乱码久久久久久久久| 在线观看日本www| 成人免费无码大片a毛片| 91视频在线视频| 一本岛在线视频| 波多野结衣亚洲一区二区| 五月天福利视频| 999视频在线| 中文字幕亚洲乱码| 日本福利视频一区| 天堂在线中文视频| 五月婷婷在线观看视频| 成人免费毛片视频| 欧美成人精品激情在线视频| 99爱视频在线| 国产a级片免费看| 日本一区二区三区网站| 蜜桃在线一区二区| 深夜视频在线观看| 久久精品国产sm调教网站演员| 最近中文字幕免费视频| 亚洲色图 校园春色| 亚洲中文字幕在线观看| 欧美一级片免费在线观看| 国产又猛又黄的视频| 亚洲中文字幕无码av永久| 天堂网中文在线观看| 好吊色视频一区二区三区| 懂色av蜜臀av粉嫩av分享吧| 欧美一级做a爰片免费视频| 久久亚洲精品大全| 色免费在线视频| 国产中文字幕二区| 久久av高潮av| 免费高清在线观看电视| 在线观看日本中文字幕| 漂亮人妻被黑人久久精品| 日韩在线视频观看免费| 精品国产va久久久久久久| 中文字幕在线观看第二页| 日韩一区二区视频在线| 久久久久久av无码免费网站| 中文字幕 日韩 欧美| 十八禁视频网站在线观看| 成年人网站免费视频| 久草免费福利在线| wwwwww欧美| 老司机午夜免费福利视频| 少妇熟女一区二区| 久久久成人精品一区二区三区| 欧美性x x x| 在线免费看av网站| 亚洲二区在线播放| 国产日韩欧美在线观看视频| 黄色录像一级片| 国产福利视频网站| 黄色香蕉视频在线观看| 手机福利在线视频| 超碰人人爱人人| 国产精品va在线观看无码| 毛片av在线播放| 在线观看污视频| 国产一二三在线视频| 国产资源在线视频| 五月婷婷激情久久| 日本77777| 国产污片在线观看| 丰满少妇乱子伦精品看片| 亚洲黄色一区二区| 久久久国产精华液| 久久精品一二区| 中文字幕人妻一区二区在线视频| 国产露脸国语对白在线| 成人免费一级视频| aaa黄色大片| 中文字幕免费高清| 天堂网avav| 国产 日韩 亚洲 欧美| 国产成人无码一二三区视频| 视频在线观看免费高清| 精品视频一区二区在线观看| 久久永久免费视频| 亚洲av无码一区二区乱子伦| 在线观看一区二区三区四区| 公侵犯人妻一区二区三区| 成年人网站在线观看视频| 美女在线免费视频| 日韩精品无码一区二区三区免费 | 性欧美videos| www.日本三级| 男人搞女人网站| 日韩熟女精品一区二区三区| 中文字幕一区二区久久人妻| 天天射天天操天天干| 欧美性xxxx图片| 视频一区二区视频| 日韩久久久久久久久久久久| 一道本视频在线观看| 国产大片中文字幕| www.黄色一片| 少妇饥渴放荡91麻豆| 国产67194| 白嫩少妇丰满一区二区| 欧美不卡视频在线观看| 国产福利资源在线| 少妇久久久久久久久久| 福利在线一区二区| 久草视频在线免费看| 国产美女三级无套内谢| 成熟妇人a片免费看网站| 91视频青青草| 免费一区二区三区在线观看 | 日韩中文字幕免费在线观看| 少妇久久久久久久久久| 天堂8在线天堂资源bt| 欧美综合在线观看视频| 亚洲天堂视频网站| 少妇高潮一区二区三区69| 精品熟妇无码av免费久久| 人妻无码久久一区二区三区免费| 久久精品国产亚洲av高清色欲| 国产精品玖玖玖| 538国产视频| 日本人体一区二区| 激情五月色婷婷| 师生出轨h灌满了1v1| 亚洲av首页在线| 1314成人网| 亚洲精品一区二区三区区别 | 2021狠狠干| 欧美日韩在线国产| 天天干天天舔天天射| 五月婷婷一区二区| 国产精品a成v人在线播放| 熟妇人妻系列aⅴ无码专区友真希| 国产女人18水真多毛片18精品| av中文字幕网址| 性一交一乱一伧老太| 乱h高h女3p含苞待放| 日本在线观看免费视频| 精品人妻少妇AV无码专区| 精品国产国产综合精品| 三区视频在线观看| 日本免费一区视频| 日韩在线视频在线| 亚洲视屏在线观看| 亚洲欧美色图视频| 91福利国产成人精品播放| 国产激情无套内精对白视频| 免费中文字幕在线| 久久一区二区三区视频| 亚洲码无人客一区二区三区| av污在线观看| 色综合视频在线| 很污的网站在线观看| 亚洲色成人www永久网站| 亚洲v国产v欧美v久久久久久| 美女一区二区三区视频| 99久久精品日本一区二区免费| 日本精品在线免费观看| 久久露脸国语精品国产91| 国产精品久久久免费观看| 香蕉视频网站入口| 天天干天天操av| 黄色片视频在线免费观看| av手机免费看| 成人一级生活片| 国产精品视频一区二区三区,| 小早川怜子一区二区的演员表| 日干夜干天天干| 亚洲av无码国产精品久久| 91精产国品一二三产区别沈先生| 中文字幕一区二区三区人妻在线视频 | 国产91视频一区| 亚洲午夜精品久久久| 最新视频 - x88av| 在线视频免费观看一区| 日本三日本三级少妇三级66| 中文字幕在线观看视频一区| 日韩黄色免费观看| 91精品视频免费在线观看 | 成人网站免费观看入口| av网站在线免费看| 国产精品自拍合集| 亚洲av无码专区在线| 波多野结衣乳巨码无在线| 亚洲第一大网站| 妺妺窝人体色www在线小说| 神宫寺奈绪一区二区三区| 少妇性l交大片| 成年人小视频在线观看| 亚洲精品永久视频| theav精尽人亡av| 国产一级久久久| 亚洲女人毛茸茸高潮| 波多野结衣影片| 桥本有菜av在线| 国产又大又长又粗| 国产美女无遮挡网站| 日本少妇xxx| 免费网站看av| 男人av资源站| 国产成人久久精品77777综合| 欧美日韩一道本| 国产激情第一页| 日本在线免费观看| 日韩专区第三页| 丰满饥渴老女人hd| 中文在线观看免费网站| 青少年xxxxx性开放hg| 国产绳艺sm调教室论坛| 91网址在线播放| 调教驯服丰满美艳麻麻在线视频| 亚洲在线视频播放| 五月婷婷深爱五月| 在线观看天堂av| av片免费播放| 国产精欧美一区二区三区白种人| 国精品人伦一区二区三区蜜桃| 一区二区三区免费观看视频| 92看片淫黄大片一级| 熟女高潮一区二区三区| 亚洲无码精品在线播放| 国产嫩草在线观看| 日本二区三区视频| 五月婷在线视频| 亚洲影院在线播放| 任你操这里只有精品| 亚洲色图日韩精品| 日批视频免费播放| 日韩成人高清视频| 内射国产内射夫妻免费频道| 强伦人妻一区二区三区| 污污网站免费在线观看| 91精品一区二区三区四区| 高清国产mv在线观看| 日韩特黄一级片| av网址在线观看免费| 亚洲一二三四视频| 午夜18视频在线观看| 男人天堂2024| 国产aaaaa毛片| www亚洲国产| 国产毛片毛片毛片毛片毛片| 久久久久久天堂| 黄色激情在线视频| 四虎永久免费影院| 精品国自产在线观看| 久久精品国产亚洲av高清色欲 | 日韩欧美中文字幕一区二区| 秋霞精品一区二区三区| 国产无套内射久久久国产| 网爆门在线观看| 日本成人在线免费| 国产又粗又大又黄| 日韩精品一区二区av| 国产精品69页| 欧美日韩视频免费| 国产白丝一区二区三区| 麻豆短视频在线观看| 国产精品色综合| 国产suv精品一区二区33| www.亚洲高清| av免费观看大全| 婷婷伊人五月天| 法国伦理少妇愉情| 国产裸体视频网站| a天堂视频在线| 成人黄色三级视频| 国产无遮无挡120秒| 亚洲视频第二页| 成人免费观看视频在线观看| 国产又爽又黄ai换脸| 精品国产成人亚洲午夜福利| 男人的天堂免费| 亚洲国产精品国自产拍久久| 久久久久久久久久成人| 国产无精乱码一区二区三区| 亚洲人视频在线| 50路60路老熟妇啪啪| 亚洲精品无码国产| 黑人巨大国产9丨视频| 日本成人精品视频| 欧美一区二区三区粗大| 国产大学生视频| 精人妻一区二区三区| 原创真实夫妻啪啪av| 亚洲第一第二区| 国产手机av在线| 国产免费黄色片| 国产又黄又爽视频| 最新中文字幕第一页| 精品美女久久久久| 黄色片视频网站| 日本一区二区不卡在线| 日韩欧美不卡视频| 国产无码精品在线播放| 国产精品16p| 黄网在线观看视频| 精品国产xxx| 久久久久久无码精品大片| 国产精品777777| 欧美日韩综合在线观看| 日韩不卡视频在线| www五月天com| 亚洲av无码乱码国产精品fc2| 99re热视频| 国产免费久久久| 亚洲国产精品二区| 免费高清视频在线观看| 又黄又色的网站| 亚洲成人av免费在线观看| theav精尽人亡av| 1024手机在线观看你懂的| 99久久久无码国产精品不卡| 亚洲熟女毛茸茸| 最新视频 - x88av| 拔插拔插海外华人免费| 免费观看精品视频| 天天干天天操天天做| 久久国产在线观看| 中文在线第一页| 国产精品久久久久久久久久久久久久久久| 中文字幕在线观看免费| 国产激情久久久久久熟女老人av| 天天射,天天干| 亚洲久久久久久| 乱老熟女一区二区三区| 8x8x华人在线| 日日碰狠狠躁久久躁婷婷| 成年人三级黄色片| 日本三级欧美三级| 怡春院在线视频| 日本免费不卡视频| 国产成人无码精品久久二区三| 三级黄色录像视频| 久久艹国产精品| 久久久精品麻豆| 青青草av在线播放| 国产福利免费视频| 亚洲AV无码国产精品| 欧美一区二区三区爽爽爽| 国产美女在线一区| 久久6免费视频| 91黑人精品一区二区三区| 亚洲av无码乱码在线观看性色| 国产草草浮力影院| www深夜成人a√在线| 大j8黑人w巨大888a片| 日本一二三区在线| 亚洲系列第一页| 国产午夜在线一区二区三区| 五月综合色婷婷| 国模杨依粉嫩蝴蝶150p| 久久国产精品系列| 亚洲av综合色区无码一区爱av| 法国伦理少妇愉情| 国产日产欧美一区二区| 性生生活大片免费看视频| 波多野结衣一区二区三区四区| 亚洲欧美日韩精品永久在线| 日本视频在线免费| 久久久999视频| 久久黄色精品视频| 午夜成人免费影院| 尤物在线免费视频| 麻豆三级在线观看| 一区二区三区黄| 久久av无码精品人妻系列试探| 无码人妻精品一区二区三区99v| 国产精品自拍视频在线| 中文字幕激情视频| 日本japanese极品少妇| 欧美高清中文字幕| 日本天堂网在线观看| 成人av手机在线| 国产欧美小视频| 亚洲福利精品视频| 亚洲无码精品在线播放| 一区二区精品免费| www.com毛片| 超碰在线97观看| 丰腴饱满的极品熟妇| 久久精品免费一区二区| 91久久国产综合久久91| 国产精品麻豆入口| 精品欧美一区免费观看α√| 无码免费一区二区三区| 西西大胆午夜视频| 无码精品a∨在线观看中文| 天天操天天干天天摸| 女人被狂躁c到高潮| av片中文字幕| 91超薄丝袜肉丝一区二区| 夫妇交换中文字幕| 国产传媒免费观看| 人妻巨大乳一二三区| 美脚丝袜脚交一区二区| 波多野结衣av无码| 精品无码在线观看|