淺談Composite組合模式

1、前言java

關於Composite組合模式,這個模式在咱們的生活中也常常使用,好比說若是讀者有使用java的GUI編寫過程序的,確定少不了定義一些組件,初始化以後,使用容器的add方法,將這些組件有順序的組織成一個界面出來;或者讀者若是編寫過前臺的頁面,確定使用過<div>等標籤訂義一些格式,而後格式之間互相組合,經過一種遞歸的方式組織成相應的結果,這種方式其實就是組合,將部分的組件鑲嵌到總體之中;又或者文件和文件夾的組織關係,經過目錄表項做爲共同的特質(父類),一個文件夾能夠包含多個文件夾和多個文件,一個文件容納在一個文件夾中。那麼憑什麼能夠這樣作呢,須要知足一下兩點:設計模式

  • 總體的結果應該是一棵樹
  • 全部的組件應該有一個共同的父類

這個父類使得組件中的共同的本質能夠提取出來,進行互融,其實就是父類只用add方法,這樣子類就能夠經過抽象的方式經過父類來表達了。學習

2、代碼this

Entry抽象類:共同特質spa

package zyr.dp.composite;

public abstract class Entry {
    public abstract String getName();
    public abstract int getSize();
    public abstract void printList(String prefix);
    public  void printList(){
        printList("");
    }
    public  Entry add(Entry entry) throws RuntimeException{
        throw new RuntimeException();
    }
    public  String toString(){
        return getName()+"<"+getSize()+">";
    }
}

File類:實現類,葉子結點.net

package zyr.dp.composite;

public class File extends Entry {

    private String name;
    private int size;
    public File(String name,int size){
        this.name=name;
        this.size=size;
    }
    public String getName() {
        return name;
    }

    public int getSize() {
        return size;
    }

    public void printList(String prefix) {
        System.out.println(prefix+"/"+this);
    }

}

Directory類:可擴充節點(中間節點)設計

package zyr.dp.composite;

import java.util.ArrayList;
import java.util.Iterator;

public class Directory extends Entry {

    String name;
    ArrayList entrys=new ArrayList();
    public Directory(String name){
        this.name=name;
    }
    public String getName() {
        return name;
    }

    public int getSize() {
        int size=0;
        Iterator it=entrys.iterator();
        while(it.hasNext()){
            size+=((Entry)it.next()).getSize();
        }
        return size;
    }

    public Entry add(Entry entry) {
        entrys.add(entry);
        return this;
    }
    
    public void printList(String prefix) {
        System.out.println(prefix+"/"+this);
        Iterator it=entrys.iterator();
        Entry entry;
        while(it.hasNext()){
            entry=(Entry)it.next();
            entry.printList(prefix+"/"+name);
        }
    }

}

Main類:組合組件3d

package zyr.dp.composite;

public class Main {

    public static void main(String[] args) {

        Directory root=new Directory("根目錄");
        
        Directory life=new Directory("個人生活");
        File eat=new File("吃火鍋",100);
        File sleep=new File("睡覺",100);
        File study=new File("學習",100);
        life.add(eat);
        life.add(sleep);
        life.add(study);
        
        Directory work=new Directory("個人工做");
        File write=new File("寫博客",200);
        File paper=new File("寫論文",200);
        File homework=new File("寫家庭做業",200);
        work.add(write);
        work.add(paper);
        work.add(homework);
        
        Directory relax=new Directory("個人休閒");
        File music=new File("聽聽音樂",200);
        File walk=new File("出去轉轉",200);
        relax.add(music);
        relax.add(walk);
        
        Directory read=new Directory("個人閱讀");
        File book=new File("學習書籍",200);
        File novel=new File("娛樂小說",200);
        read.add(book);
        read.add(novel);
        
        root.add(life);
        root.add(work);
        root.add(relax);
        root.add(read);

        root.printList("D:");
        System.out.println("=================");
        work.printList("work");
        System.out.println("=================");
        novel.printList("novel");
        

    }

}

運行結果:code

3、總結blog

因而可知,咱們之前使用的「容器+內容」,實際上是經過組合模式實現的,組合模式保證了容器和內容的一致性,容器裏面能夠嵌套容器,也能夠放內容,可是內容已是葉子結點了,不能繼續擴充,還記得咱們在抽象工廠模式中,爲了將零件組裝成產品,咱們就使用了組合模式,很是的有意思,經過遞歸來遍歷全部的內容。組合模式在咱們的生活中使用的很是廣泛,咱們必定要使用好這個模式,理解其中的抽象,特別是add()的定義,抽象類和實現類之間的參數傳遞,這點相當重要,固然咱們又使用了模板方法和迭代器,但願你們能明白模式之間的聯繫以及相互使用的道理。

 

淺談設計模式<最通俗易懂的講解>

相關文章
相關標籤/搜索