1. Composite模式
容器与内容的一致性,创造出递归结构,Composite英文意思是:“混合物”“复合物”
1.1 Composite模式的类图
登场角色:
-
Leaf(叶子)
表示“内容”角色,该角色不能再放入其他对象 -
Composite(复合物)
表示容器角色,可以放Leaf和Composite -
Component(组件)
表明了容器和叶子的一致性 -
Client(用户)
使用者
1.2 示例程序
类一览表:
名字 | 说明 |
---|---|
Entry | 抽象类,表现了File类和Directory的一致性 |
File | 表示文件类 |
Directory | 表示文件夹类 |
FileTreatementException | 新建的一个异常类 |
Main | 测试类 |
uml类图:
Entry类
package xin.ajay.composite;
public abstract class Entry {
private String name;
public Entry(String name) {
this.name = name;
}
public String getName(){
return name;
}//获取名字
public abstract int getSize();
public Entry add(Entry entry) throws FileTreadtmentException{
throw new FileTreadtmentException();
}
public void printList(){
printList("");
}
protected abstract void printList(String prefix);
public String toString(){
return getName() + " ("+ getSize()+")";
}
}
File类
package xin.ajay.composite;
public class File extends Entry {
private int size;
public File(String name,int size) {
super(name);
this.size = size;
}
@Override
public int getSize() {
return size;
}
@Override
protected void printList(String prefix) {
System.out.println(prefix + "/" + this);
}
}
Directory类
package xin.ajay.composite;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Directory extends Entry {
private List<Entry> directory = new ArrayList<>();
public Directory(String name) {
super(name);
}
@Override
public int getSize() {
int size = 0;
for (Entry e : directory) {
size = e.getSize();
}
return size;
}
@Override
protected void printList(String prefix) {
System.out.println(prefix+"/"+this);
for (Entry e : directory) {
e.printList(prefix+"/"+getName());
}
}
@Override
public Entry add(Entry entry) {
directory.add(entry);
return this;
}
}
FileTreadtmentException类
package xin.ajay.composite;
import java.io.IOException;
public class FileTreadtmentException extends Exception {
}
Main类
package xin.ajay.composite;
public class Main {
public static void main(String[] args) {
/*
--|root
----|bin
------|vi
------|latex
----|tmp
----|usr
-------------------------------------------
--|root
----|bin
------|vi
------|latex
----|tmp
----|usr
------|yuki
--------|diary.html
--------|Composite.java
------|hanako
--------|memo.tex
------|tomura
--------|game.doc
--------|iunk.mail
*/
System.out.println("Making root entries...");
Directory root = new Directory("root");
Directory bin = new Directory("bin");
Directory tmp = new Directory("tmp");
Directory usr = new Directory("usr");
root.add(bin);
root.add(tmp);
root.add(usr);
bin.add(new File("vi",100));
bin.add(new File("latex",200));
root.printList();
System.out.println();
System.out.println("Making user entries...");
Directory yuki = new Directory("yuki");
yuki.add(new File("diary.html", 10));
yuki.add(new File("Composite.java",20));
Directory hanako = new Directory("hanako");
hanako.add(new File("memo.tex",11));
Directory tomura = new Directory("tomura");
tomura.add(new File("game.doc",12));
tomura.add(new File("iunl.mail",13));
usr.add(yuki);
usr.add(hanako);
usr.add(tomura);
root.printList();
}
}
鸣谢
GoF《设计模式》和结城浩的《图解设计模式》