设计模式(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();
		}

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值