JAVA與模式:合成模式

來源:互聯網
上載者:User

仲介交易 HTTP://www.aliyun.com/zixun/aggregation/6858.html">SEO診斷 淘寶客 雲主機 技術大廳

合成(Composite)模式是一種非常重要的設計模式,合成模式將物件組織到樹中,用來描述樹的關係。 一、原理圖從原理圖可見,File、Folder都可以同等看待葦IFile,為物件管理提供了極大的便利。 當然,樹的概念不單單是檔資料夾的層次概念,只是因為這個很形象,實際中還有很多樹的概念,比如組織機構,分類層次等等,都是邏輯上的概念,不管是物理上的還是邏輯上的,在JAVA裡都是一樣處理的。 二、實例下面以一個邏輯樹為例子,以上面的原理圖為藍本,看看如何實現並如何使用這個樹,這個結構很簡單,但是如何去使用樹,遍歷樹、為我所用還是有一定難度的。 這裡主要用到樹的遞迴遍歷,如何遞迴、如何控制遍歷層級,如何將邏輯關係轉換為(類似)物理關係,這些都是有相當難度的。 廢話就不說了,看看便知。 /**


* Created by IntelliJ IDEA.


* User: leizhimin


* Date: 2008-8-2 16:13:59


* 抽象檔角色


*/


public interface IFile {


//返回自己的實例


IFile getComposite();





//某個商業方法


void sampleOperation();





//獲取深度


int getDeep();





//設置深度


void setDeep(int x);





}import java.util.Vector;





/**


* Created by IntelliJ IDEA.


* User: leizhimin


* Date: 2008-8-2 16:15:03


* 資料夾角色


*/


public class Folder implements IFile {


private String name; 檔案名字


private int deep; 層級深度,根深度為0


private Vector<IFile> componentVector = new Vector<IFile>();





public Folder(String name) {


this.name = name;


}





//返回自己的實例


public IFile getComposite() {


return this;


}





//某個商業方法


public void sampleOperation() {


System.out.println("執行了某個商業方法! ");


}





//增加一個檔或資料夾


public void add(IFile IFile) {


componentVector.addElement(IFile);


IFile.setDeep(this.deep 1);





}





//刪除一個檔或資料夾


public void remove(IFile IFile) {


componentVector.removeElement(IFile);


}





//返回直接子檔(夾)集合


public Vector getAllComponent() {


return componentVector;


}





public String getName() {


return name;


}





public void setName(String name) {


this.name = name;


}





public int getDeep() {


return deep;


}





public void setDeep(int deep) {


this.deep = deep;


}


}/**


* Created by IntelliJ IDEA.


* User: leizhimin


* Date: 2008-8-2 16:27:15


* 檔


*/


public class File implements IFile {


private String name; 檔案名字


private int deep; 層級深度





public File(String name) {


this.name = name;


}





//返回自己的實例


public IFile getComposite() {


return this;


}





//某個商業方法


public void sampleOperation() {


System.out.println("執行了某個商業方法! ");


}





public String getName() {


return name;


}





public void setName(String name) {


this.name = name;


}





public int getDeep() {


return deep;


}





public void setDeep(int deep) {


this.deep = deep;


}


}import java.util.Iterator;


import java.util.Vector;





/**


* Created by IntelliJ IDEA.


* User: leizhimin


* Date: 2008-8-2 16:35:25


* 遍歷樹的一個測試


*/


public class Client {


public static String indentChar = "\t"; 檔層次縮進字元





public static void main(String args[]) {


new Client().test();


}





/**


* 用戶端測試方法


*/


public void test() {


//根下檔及資料夾


Folder root = new Folder("樹根");





Folder b1_1 = new Folder("1_枝1");


Folder b1_2 = new Folder("1_枝2");


Folder b1_3 = new Folder("1_枝3");


File l1_1 = new File("1_葉1");


File l1_2 = new File("1_葉2");


File l1_3 = new File("1_葉3");





//b1_2下的檔及資料夾


Folder b2_1 = new Folder("2_枝1");


Folder b2_2 = new Folder("2_枝2");


File l2_1 = new File("2_葉1");





//締造樹的層次關係(簡單測試,沒有重複添加的控制)


root.add(b1_1);


root.add(b1_2);


root.add(l1_1);


root.add(l1_2);





b1_2.add(b2_1);


b1_2.add(b2_2);


b1_2.add(l2_1);


root.add(l1_3);


root.add(b1_3);


//主控台列印樹的層次


outTree(root);


}





public void outTree(Folder folder) {


System.out.println(folder.getName());


iterateTree(folder);


}





/**


* 遍歷資料夾,輸入檔樹


*


* @param folder


*/


public void iterateTree(Folder folder) {


Vector<IFile> clist = folder.getAllComponent();


//todo:遍歷之前可以對clist進行排序,這些都不是重點


for (Iterator<IFile> it = clist.iterator(); it.hasNext();) {


IFile em = it.next();


if (em instanceof Folder) {


Folder cm = (Folder) em;


System.out.println(getIndents(em.getDeep()) cm.getName());


iterateTree(cm);


} else {


System.out.println(getIndents(em.getDeep()) ((File) em).getName());


}


}


}





/**


* 檔層次縮進字串


*


* @param x 縮進字元個數


* @return 縮進字串


*/


public static String getIndents(int x) {


StringBuilder sb = new StringBuilder();


for (int i = 0; i < x; i ) {


sb.append(indentChar);


}


return sb.toString();


}


}三、運行測試主控台輸出如下:

可見,樹邏輯關係已經成功展示出來了。 四、總結1、上面所用的合成模式是安全合成模式,所謂的安全是指File與Folder中的方法不同。 Folder有對聚集物件的管理,File沒有。 2、合成模式在程式設計中有著廣泛的應用,比如Dom4j、資源管理器、JAVA GUI容器層次圖等等都是合成模式應用的典範。 3、合成模式很多都是需要分析思考才能鑒別出來的,比如要做一個複雜的數學運算式計算機,有四種運算子號。 分析發現,運算量有兩種,一種是數位、一種是數位的運算式,但是運算式也是由數位組成,因此數位和運算式可以抽象為運算量。 然後去表達要運算的運算式。 問題迎刃而解。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.