天天看点

设计模式(Java)—Composite模式

Composite模式是能够使容器与内容具有一致性,创造出递归结构的模式

一、示例程序

列出文件和文件夹

Entry类:

package Composite;
//实体类,将文件类和文件夹类统一起来
public abstract class Entry {
	public abstract String getName();
	public abstract int getSize();
	public Entry add(Entry entry) throws FileTreatmentException{
		throw new FileTreatmentException();
	}
	public void printList(){
		printList("");
	}
	protected abstract void printList(String prefix);
	public String toString(){
		return getName() + "("+getSize()+")";
	}

}

           

此类是一个表示目录条目的抽象类,File类和Directory类是它的子类

File类:

package Composite;
//文件类,实现抽象类的方法
public class File extends Entry {
	private String name;
	private int size;

	public File(String name,int size) {
		// TODO Auto-generated constructor stub
		this.name = name;
		this.size = size;
	}

	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return name;
	}

	@Override
	public int getSize() {
		// TODO Auto-generated method stub
		return size;
	}

	@Override
	protected void printList(String prefix) {
		// TODO Auto-generated method stub
		System.out.println(prefix+"/"+this);

	}

}

           

实现类,实现了抽象类里的抽象方法

Directory类:

package Composite;

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

import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;
//文件夹类
public class Directory extends Entry {
	private String name;
	private ArrayList directory = new ArrayList();

	public Directory(String name) {
		// TODO Auto-generated constructor stub
		this.name = name;
	}

	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return name;
	}

	@Override
	public int getSize() {
		int size = 0;
		Iterator it = directory.iterator();
		while(it.hasNext()){
			Entry entry = (Entry)it.next();
			size += entry.getSize();
		}
		// TODO Auto-generated method stub
		return size;
	}
	public Entry add(Entry entry){
		directory.add(entry);
		return this;
	}

	@Override
	protected void printList(String prefix) {
		// TODO Auto-generated method stub
		System.out.println(prefix+"/"+this);
		Iterator it = directory.iterator();
		while(it.hasNext()){
			Entry entry = (Entry)it.next();
			entry.printList(prefix+"/"+name);
		}
	}

}

           

实现类,实现了抽象类的抽象方法

FileTreatMentException类:

package Composite;

public class FileTreatmentException extends RuntimeException {

	public FileTreatmentException() {
		// TODO Auto-generated constructor stub
	}

	public FileTreatmentException(String msg) {
		super(msg);
		// TODO Auto-generated constructor stub
	}
}

           

Main类:

package Composite;

import java.text.FieldPosition;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			System.out.println("Making root entries...");
			Directory rootdir = new Directory("root");
			Directory bindir = new Directory("bin");
			Directory tmpdir = new Directory("tmp");
			Directory usrdir = new Directory("usr");
			rootdir.add(bindir);
			rootdir.add(tmpdir);
			rootdir.add(usrdir);
			bindir.add(new File("vi", 10000));
			bindir.add(new File("latex", 20000));
			rootdir.printList();
			
			System.out.println("");
			System.out.println("Making user entries...");
			Directory yuki = new Directory("yuki");
			Directory hanako = new Directory("hanako");
			Directory tomura = new Directory("tomura");
			usrdir.add(yuki);
			usrdir.add(hanako);
			usrdir.add(tomura);
			yuki.add(new File("diary.html", 100));
			yuki.add(new File("Composite.java", 200));
			hanako.add(new File("memo.tex", 300));
			tomura.add(new File("game.doc", 400));
			tomura.add(new File("junk.mail", 500));
			rootdir.printList();
			
		} catch (FileTreatmentException e) {
			// TODO: handle exception
			e.printStackTrace();
		}

	}

}