介绍
组合模式(Composite Pattern)属于结构型模式,它创建了对象组的树形结构
优点
- 高层调用简单
- 子节点易于扩展
缺点
- 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则
应用
文件管理,Android中view、viewgroup的实现
实现
关键代码
树枝含有内部属性 List,里面存放其子节点
// 实现了一个简易的命令行,文件管理系统
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class File {
private String name;
private List<File> childeren;
//构造函数
public File(String name) {
this.name = name;
childeren = new ArrayList<File>();
}
public void add(File e) {
childeren.add(e);
}
public void remove(File e) {
childeren.remove(e);
}
public List<File> getSubordinates(){
return childeren;
}
public String toString(){
return name;
}
}
class CompositePatternDemo {
public static void main(String[] args) {
File disk = new File("C");
File system = new File("system");
File user = new File("user");
File system_1 = new File("Kernel");
File system_2 = new File("etc");
File user_1 = new File("Program Files");
File user_2 = new File("Games");
disk.add(system);
disk.add(user);
system.add(system_1);
system.add(system_2);
user.add(user_1);
user.add(user_2);
Scanner scan = new Scanner(System.in);
File current = disk;
System.out.print("[user://"+current.toString()+"]");
while(true){
if (scan.hasNextLine()) {
String str1 = scan.nextLine();
if(str1.equals("help") ){
System.out.println("please type cd/ls");
System.out.print("[user://"+current.toString()+"]");
}
if(str1.startsWith("cd")){
boolean exist = false;
for(File f:current.getSubordinates()){
if(str1.endsWith(f.toString())){
exist = true;
current = f;
}
}
if(!exist){System.out.println("error");}
System.out.print("[user://"+current.toString()+"]");
}
if(str1.equals("ls")){
for(File f:current.getSubordinates()){
System.out.print(f.toString()+" ");
}
System.out.println();
System.out.print("[user://"+current.toString()+"]");
}
}
}
}
}
运行结果
[user://C]ls
system user
[user://C]cd system
[user://system]ls
Kernel etc
[user://system]cd etc
[user://etc]ls
[user://etc]