您的位置:首页 > 编程语言 > Java开发

Java设计模式(6) -- 组合

2009-08-19 12:01 447 查看
Composite

英文简单描述

Intent

You want to represent part-whole hierarchies of objects.

Composite lets clients treat individual objects and compositions of objects uniformly.

How to

Component

declares the interface for objects in the composition.

implements default behavior for the interface common to all classes, as appropriate.

Leaf

represents leaf objects in the composition. A leaf has no children.

Composite

defines behavior for components having children.

implements child-related operations in the Component interface.



Known cases


File System(Dir or File)

Filter(AndSpec、OrSpec、EqualSpec)

UML






权衡:

add和remove这些管理孩子的方法是放到component接口中好呢,还是放到Composite中好呢?

(1)放到component接口中,提供默认的实现,抛出异常,如:

public void add(IFileSystemComponent comp) {
throw new UnsupportedOperationException();
}



Leaf类不提供对其的实现,如果client调用了,则抛出异常;Composite类实现添加child的功能;这样不用判断其类型,可以统一接口

(2)将其下移到Composite,但是不能统一接口

代码:

public abstract class FileSystemComponent {
public void add(FileSystemComponent comp) {
throw new UnsupportedOperationException("add");
}

public void remove(FileSystemComponent comp) {
throw new UnsupportedOperationException("remove");
}

public abstract long getSize();
}
public class File extends FileSystemComponent {
private long length;

public File(long length) {
this.length = length;
}

public long getSize() {
return length;
}
}
public class Directory extends FileSystemComponent {
private List<FileSystemComponent> files = new ArrayList<FileSystemComponent>();

public void add(FileSystemComponent comp) {
files.add(comp);
}

public void remove(FileSystemComponent comp) {
files.remove(comp);
}
public long getSize() {
long len = 0;
for (int i = 0; i < files.size(); i++) {
FileSystemComponent comp = files.get(i);
len += comp.getSize();
}
return len;
}

}
public class TestComposite {
public static void main(String[] args) {
File file;
file = new File(10);
Directory dir = new Directory();
dir.add(file);
file = new File(20);
dir.add(file);
Directory root = new Directory();
root.add(dir);
file = new File(30);
root.add(file);

System.out.println(getSize(root));
}

public static long getSize(FileSystemComponent comp) {
return comp.getSize();
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: