Java設計模式之十四(組合模式)

一、什麼是組合模式

Composite模式也叫組合模式,是構造型的設計模式之一。通過遞歸手段來構造樹形的對象結構,並可以通過一個對象來訪問整個對象樹。


二、組合模式的結構


三、組合模式的角色和職責

Component (樹形結構的節點抽象)

- 爲所有的對象定義統一的接口(公共屬性,行爲等的定義)

- 提供管理子節點對象的接口方法

- [可選]提供管理父節點對象的接口方法

Leaf (樹形結構的葉節點)
Component的實現子類

Composite(樹形結構的枝節點)
Component的實現子類


代碼實現:

Component (樹形結構的節點抽象類)

package com.qianyan.composite;

import java.util.List;

/**
 * 文件節點抽象(是文件和目錄的父類)
 * @author hadoop
 *
 */
public interface IFile {

	/**
	 * 顯示文件或者文件夾名稱
	 */
	public void display();

	/**
	 * 添加
	 * @return
	 */
	public boolean add(IFile file);
	
	/**
	 * 刪除
	 * @return
	 */
	public boolean remove(IFile file);
	
	/**
	 * 獲取子節點
	 * @return
	 */
	public List<IFile> getChild();
}

Leaf (樹形結構的葉節點類)

package com.qianyan.composite;

import java.util.List;

public class File implements IFile {

	private String name;
	
	public File(String name) {
		this.name = name;
	}
	
	@Override
	public void display() {
		System.out.println(name);
	}

	@Override
	public boolean add(IFile file) {
		return false;
	}

	@Override
	public boolean remove(IFile file) {
		return false;
	}

	@Override
	public List<IFile> getChild() {
		return null;
	}

}


Composite(樹形結構的枝節點類):

package com.qianyan.composite;

import java.util.ArrayList;
import java.util.List;

public class Forder implements IFile {

	private String name;
	private List<IFile> children;
	
	public Forder(String name) {
		this.name = name;
		children = new ArrayList<IFile>();
	}
	
	@Override
	public void display() {
		System.out.println(name);
	}

	@Override
	public boolean add(IFile file) {
		return children.add(file);
	}

	@Override
	public boolean remove(IFile file) {
		return children.remove(file);
	}

	@Override
	public List<IFile> getChild() {
		return children;
	}

}

測試類:

package com.qianyan.composite;

import java.util.List;

public class MainClass {

	public static void main(String[] args) {
		//c盤
		Forder root = new Forder("c:");
		
		//qianyan目錄
		Forder qianyanForder = new Forder("qianyan");
		//qianyan.txt文件
		File qianyanFile = new File("qianyan.txt");
		
		//qianyanChild目錄
		Forder qianyanChildForder = new Forder("qianyanChild");
		//qianyanChild.txt文件
		File qianyanChildFile = new File("qianyanChild.txt");
		
		//添加qianyanChild目錄到qianyan目錄
		qianyanForder.add(qianyanChildForder);
		//添加qianyanChild.txt文件到qianyan目錄
		qianyanForder.add(qianyanChildFile);
		
		//添加qianyanChild目錄到c盤
		root.add(qianyanForder);
		//添加qianyan.txt文件到c盤
		root.add(qianyanFile);
		
		//顯示文件目錄結構
		displayTree(root, 0);
	}
	
	public static void displayTree(IFile root, int deep) {
		for(int i = 0; i < deep; i++)
			System.out.print("--");
		//顯示自身的名稱
		root.display();
		//獲得子樹
		List<IFile> children = root.getChild();
		//遍歷子樹
		for(int i = 0; i < children.size(); i++) {
			IFile file = children.get(i);
			if(file instanceof File) {
				for(int j = 0; j <= deep; j++)
					System.out.print("--");
				file.display();
			}
			else
				displayTree(file, deep + 1);
		}
	}
}

測試結果:

c:
--qianyan
----qianyanChild
----qianyanChild.txt
--qianyan.txt


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章