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接口中,提供默认的实现,抛出异常,如:
Leaf类不提供对其的实现,如果client调用了,则抛出异常;Composite类实现添加child的功能;这样不用判断其类型,可以统一接口
(2)将其下移到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(); } }
相关文章推荐
- Java设计模式之 —— 组合(Composite)
- JAVA设计模式之组合模式
- java设计模式之组合模式Composite
- Java设计模式应用——组合模式
- Java设计模式之组合模式
- Java设计模式透析之 —— 组合(Composite)
- Java设计模式之组合模式
- Java设计模式之-组合模式
- Java 设计模式之组合模式的详解(结构模式)
- Java设计模式透析之 —— 组合(Composite)
- java设计模式之组合模式
- Java设计模式十六:组合模式(Composite Pattern)
- java设计模式-组合模式(Composite)
- java设计模式——组合模式
- JAVA设计模式(组合模式)
- Java设计模式--组合模式【Composite Pattern】
- JAVA设计模式(10):结构型-组合模式(Composite)
- java设计模式(三)——模板、访问者、组合、解释器、迭代器、中介者
- Java与设计模式-组合模式
- 设计模式_组合模式(Java)