1类图
2定义
将对象组合成树形结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
3应用场景
1. 表示对象的整体-部分层次结构时。
2. 从一个整体中能够独立出部分模块或功能的场景。
通用模板
4抽象根节点
public abstract class Component {
protected String name;
public Component(String name){
this.name = name;
}
public abstract void doSomething();
public abstract void addChild(Component child);
public abstract void removeChild(Component child);
public abstract Component getChildren(int index);
}
5具体的枝干节点
public class Composite extends Component {
private List<Component> components = new ArrayList<>();
public Composite(String name) {
super(name);
}
@Override
public void doSomething() {
System.out.println(name);
if(null != components){
for(Component c : components){
c.doSomething();
}
}
}
public void addChild(Component child){
components.add(child);
}
public void removeChild(Component child){
components.remove(child);
}
public Component getChildren(int index){
return components.get(index);
}
}
6具体叶子节点
public class Leaf extends Component {
public Leaf(String name) {
super(name);
}
@Override
public void doSomething() {
System.out.println(name);
}
@Override
public void addChild(Component child) {
}
@Override
public void removeChild(Component child) {
}
@Override
public Component getChildren(int index) {
return null;
}
}
7客户类
public class Client {
public static void main(String[] args) {
Composite root = new Composite("Root");
Composite branch1 = new Composite("Breanch1");
Composite branch2 = new Composite("Breanch2");
Leaf leaf1 = new Leaf("Leaf1");
Leaf leaf2 = new Leaf("Leaf2");
branch1.addChild(leaf1);
branch2.addChild(leaf2);
root.addChild(branch1);
root.addChild(branch2);
root.doSomething();
}
}
简单实现
8文件和文件夹的抽象类
public abstract class Dir {
protected List<Dir> dirs = new ArrayList<>();
private String name;
public Dir(String name){
this.name = name;
}
public abstract void addDir(Dir dir);
public abstract void rmDir(Dir dir);
public abstract void clear();
public abstract void print();
public abstract List<Dir> getFile();
public String getName(){
return name;
}
}
9文件夹类
public class Folder extends Dir {
public Folder(String name) {
super(name);
}
@Override
public void addDir(Dir dir) {
dirs.add(dir);
}
@Override
public void rmDir(Dir dir) {
dirs.remove(dir);
}
@Override
public void clear() {
dirs.clear();
}
@Override
public void print() {
System.out.print(getName() + "(");
Iterator<Dir> iter = dirs.iterator();
while(iter.hasNext()){
Dir dir = iter.next();
dir.print();
if(iter.hasNext())
System.out.print(", ");
}
System.out.print(")");
}
@Override
public List<Dir> getFile() {
return dirs;
}
}
10文件类
public class File extends Dir {
public File(String name) {
super(name);
}
@Override
public void addDir(Dir dir) {
}
@Override
public void rmDir(Dir dir) {
}
@Override
public void clear() {
}
@Override
public void print() {
System.out.print(getName());
}
@Override
public List<Dir> getFile() {
return null;
}
}
11客户类
public class Client {
public static void main(String[] args) {
Dir diskC = new Folder("C");
diskC.addDir(new File("ImbaMallLog.txt"));
Dir dirWin = new Folder("Windows");
dirWin.addDir(new File("explorer.exe"));
diskC.addDir(dirWin);
Dir dirPer = new Folder("PerfLogs");
dirPer.addDir(new File("null.txt"));
diskC.addDir(dirPer);
Dir dirPro = new Folder("Program File");
dirPro.addDir(new File("ftp.txt"));
diskC.addDir(dirPro);
diskC.print();
}
}