设计模式示例_复合设计模式示例
設計模式示例
本文是我們名為“ Java設計模式 ”的學院課程的一部分。
在本課程中,您將深入研究大量的設計模式,并了解如何在Java中實現和利用它們。 您將了解模式如此重要的原因,并了解何時以及如何應用模式中的每一個。 在這里查看 !
目錄
1.簡介 2.什么是復合模式 3.復合圖案的例子 4.何時使用復合圖案 5.下載源代碼1.簡介
在本課程中,我們將討論一個非常有趣的設計模式,即Composite Pattern。 Composite一詞的英文含義是由復雜且相關的部分組成。 復合意味著“放在一起”,這就是該設計模式的全部目的。
有時您會覺得代碼中需要樹數據結構。 樹數據結構有很多變體,但是有時需要一棵樹,其中樹的分支和葉子都應被統一對待。
Composite Pattern允許您將對象組合成樹形結構以表示整個部分的層次結構,這意味著您可以創建由不同部分組成的對象樹,但是可以將其視為一個整體。 Composite使客戶能夠統一地對待單個對象和對象組成,這就是Composite Pattern的目的。
復合模式可以有很多實際的例子。 文件目錄系統,Java中的html表示形式,XML解析器都是良好管理的組合,并且可以使用“組合模式”輕松表示所有這些。 但是在深入研究示例細節之前,讓我們看一下有關“復合模式”的更多細節。
2.什么是復合模式
復合模式的正式定義表示,它允許您將對象組合成樹形結構以表示部分整體層次結構。 復合可以使客戶統一對待單個對象和對象組成。
如果您熟悉樹的數據結構,您將知道樹上有父母和他們的孩子。 一個父母可以有多個孩子,但每個孩子只能有一個父母。 在“復合模式”中,具有子級的元素稱為“節點”,而沒有子級的元素稱為“葉子”。
復合模式使我們能夠以樹的形式構建對象的結構,其中既包含對象的組成又包含作為節點的單個對象。 使用復合結構,我們可以對復合物和單個對象應用相同的操作。 換句話說,在大多數情況下,我們可以忽略對象的構成與單個對象之間的差異。
復合模式有四個參與者:
下圖顯示了典型的Composite對象結構。 如您所見,單親可以有多個孩子,即“復合”,但每個孩子只有一個父母。
圖1
下面的類圖中的Component為復合對象和葉節點中的所有對象定義了一個接口。 組件可以實現通用方法的默認行為。
復合組件的作用是定義具有子組件的組件的行為并存儲子組件。 Composite還實現了與Leaf有關的操作。 這些操作可能有意義,也可能不會有意義。 它取決于使用模式實現的功能。
圖2
葉子定義了合成中元素的行為。 它通過實現組件支持的操作來實現。 Leaf還繼承了方法,這些方法對于葉子節點不一定很有意義。
客戶端通過Component接口操作合成中的對象。
3.復合圖案的例子
您可以在具有系統或子系統的層次結構性質且要統一對待單個對象和對象組成的任何地方實施Composite模式。 可以使用復合模式來實現文件系統,XML,HTML或辦公室的層次結構(從總裁到員工)。
讓我們看一個簡單的示例,其中我們使用Composite Pattern在Java中實現html表示形式。 html本質上是分層的,它從<html>標記(它是父標記或根標記)開始,并且包含其他可以是父或子標記的標記。
可以使用Component類作為抽象類或接口來實現Java中的Composite Pattern。 在此示例中,我們將使用一個抽象類,其中包含復合類和葉類中使用的所有重要方法。
package com.javacodegeeks.patterns.compositepattern;import java.util.List;public abstract class HtmlTag {public abstract String getTagName();public abstract void setStartTag(String tag);public abstract void setEndTag(String tag);public void setTagBody(String tagBody){throw new UnsupportedOperationException("Current operation is not support for this object");}public void addChildTag(HtmlTag htmlTag){throw new UnsupportedOperationException("Current operation is not support for this object");}public void removeChildTag(HtmlTag htmlTag){throw new UnsupportedOperationException("Current operation is not support for this object");}public List<HtmlTag>getChildren(){throw new UnsupportedOperationException("Current operation is not support for this object");}public abstract void generateHtml();}HtmlTag類是組件類,它定義了復合類和葉子類使用的所有方法。 在這兩個擴展類中,應該有一些共同的方法。 因此,這些方法在上面的類中保持抽象,以強制在子類中實現它們。
getTagName()只是返回標簽名稱,并且兩個子類(即復合類和葉類)都應使用它。
每個html元素都應該有一個開始標記和一個結束標記, setStartTag和setEndTag方法用于設置html元素的開始和結束標記,并且應該由兩個子類實現,因此它們在上述類中保持抽象。
有些方法僅對復合類有用,而對葉類沒有用。 只需為這些方法提供默認實現,拋出異常是這些方法的良好實現,以避免不應支持它們的對象意外調用這些方法。
generatHtml()方法是兩個擴展類都應支持的操作。 為了簡單起見,它僅將標簽打印到控制臺。
現在,讓我們看一下Composite類。
package com.javacodegeeks.patterns.compositepattern;import java.util.ArrayList; import java.util.List;public class HtmlParentElement extends HtmlTag {private String tagName;private String startTag; private String endTag;private List<HtmlTag>childrenTag;public HtmlParentElement(String tagName){this.tagName = tagName;this.startTag = "";this.endTag = "";this.childrenTag = new ArrayList<>();}@Overridepublic String getTagName() {return tagName;}@Overridepublic void setStartTag(String tag) {this.startTag = tag;}@Overridepublic void setEndTag(String tag) {this.endTag = tag;}@Overridepublic void addChildTag(HtmlTag htmlTag){childrenTag.add(htmlTag);}@Overridepublic void removeChildTag(HtmlTag htmlTag){childrenTag.remove(htmlTag);}@Overridepublic List<HtmlTag>getChildren(){return childrenTag;}@Overridepublic void generateHtml() {System.out.println(startTag);for(HtmlTag tag : childrenTag){tag.generateHtml();}System.out.println(endTag);}}HtmlParentElement類是復合類,它實現諸如addChildTag , removeChildTag和getChildren類的方法,這些方法必須由一個類實現才能成為結構的組合。 這里的操作方法是generateHtml ,它打印當前類的標記,并遍歷其子類并調用其generateHtml方法。
package com.javacodegeeks.patterns.compositepattern;public class HtmlElement extends HtmlTag{private String tagName;private String startTag; private String endTag;private String tagBody;public HtmlElement(String tagName){this.tagName = tagName;this.tagBody = "";this.startTag = "";this.endTag = "";}@Overridepublic String getTagName() {return tagName;}@Overridepublic void setStartTag(String tag) {this.startTag = tag;}@Overridepublic void setEndTag(String tag) {this.endTag = tag;}@Overridepublic void setTagBody(String tagBody){this.tagBody = tagBody;}@Overridepublic void generateHtml() {System.out.println(startTag+""+tagBody+""+endTag);}}HtmlElement是葉子類,其主要工作是實現操作方法,在本示例中為generateHtml方法。 它會打印startTag ,可選的tagBody(如果有)以及子元素的endTag 。
讓我們測試這個例子。
package com.javacodegeeks.patterns.compositepattern;public class TestCompositePattern {public static void main(String[] args) {HtmlTag parentTag = new HtmlParentElement("<html>");parentTag.setStartTag("<html>");parentTag.setEndTag("</html>");HtmlTag p1 = new HtmlParentElement("<body>");p1.setStartTag("<body>");p1.setEndTag("</body>");parentTag.addChildTag(p1);HtmlTag child1 = new HtmlElement("<p>");child1.setStartTag("<p>");child1.setEndTag("</p>");child1.setTagBody("Testing html tag library");p1.addChildTag(child1);child1 = new HtmlElement("<p>");child1.setStartTag("<p>");child1.setEndTag("</p>");child1.setTagBody("Paragraph 2");p1.addChildTag(child1);parentTag.generateHtml();}}上面的代碼將導致以下輸出:
<html> <body> <p>Testing html tag library</p> <p>Paragraph 2</p> </body> </html>在上面的示例中,首先我們創建了一個父標記(<html>),然后為其添加了一個子代,該子代是另一個復合類型(<body>),并且該對象包含兩個子代(<p>)。
請注意,以上結構表示為整體層次結構,并且對父標記的generateHtml()方法的調用允許客戶端統一對待對象的組成。 當它生成對象及其所有子對象的html時。
4.何時使用復合圖案
5.下載源代碼
這是關于“復合模式”的課程。 您可以在此處下載源代碼: CompositePattern-Project
翻譯自: https://www.javacodegeeks.com/2015/09/composite-design-pattern.html
設計模式示例
總結
以上是生活随笔為你收集整理的设计模式示例_复合设计模式示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑上用MP3播放软件(电脑上用mp3播
- 下一篇: 历史上封狼居胥的人有几个(古代封狼居胥的