什么是组合服务
组合服务指的是一个整体和个体操作的共同属性放在一个顶层接口或抽象类中,整体和个体作为这个类的子类根据不同的规则进行不同的实现。
组合服务的使用
组合服务常用的场景有一个文件目录可能存在文件和文件夹,而文件下下面又有文件和文件夹,这种情况为了解决类似List<List>这种多层次调用的问题可以将文件和文件夹抽象为一个目录,抽象方法如下:
public abstract class Directory {
protected String name;
public Directory(String name) {
this.name = name;
}
public abstract void show();
}
此时可以将文件和文件夹分别继承这个抽象类,分别实现其中的方法达到不同的展示目的。
public class File extends Directory{
public File(String name) {
super(name);
}
@Override
public void show() {
System.out.println(this.name);
}
}
public class Folder extends Directory{
private List<Directory> dirs;
private Integer level;
public Folder(String name,Integer level) {
super(name);
this.level = level;
this.dirs = new ArrayList<Directory>();
}
@Override
public void show() {
System.out.println(this.name);
for (Directory directory:dirs){
if (this.level!=null){
for (int i = 0; i < this.level; i++) {
System.out.print(" ");
}
for (int i = 0; i < this.level; i++) {
if (i==0){
System.out.print("+");
}
System.out.print("-");
}
directory.show();
}
}
}
public boolean add(Directory dir){
return this.dirs.add(dir);
}
public boolean remove(Directory dir){
return this.dirs.remove(dir);
}
public Directory get(int index){
return this.dirs.get(index);
}
public void list(){
for (Directory dir:dirs) {
System.out.println(dir.name);
}
}
}
通过实现不同的show方法达到展示的目的。
测试上面代码的案例。
public class Test {
public static void main(String[] args) {
System.out.println("==========组合模式===========");
File word = new File("Word.exe");
File excel = new File("Excel.exe");
File ppt = new File("PowerPoint.exe");
Folder office = new Folder("办公软件",2);
office.add(word);
office.add(excel);
office.add(ppt);
File qq = new File("QQ.exe");
File wx = new File("微信.exe");
Folder root = new Folder("D盘",1);
root.add(qq);
root.add(wx);
root.add(office);
System.out.println("==========show()===========");
root.show();
System.out.println("==========list()===========");
root.list();
}
}
输出结果
==========show()===========
D盘
+-QQ.exe
+-微信.exe
+-办公软件
+--Word.exe
+--Excel.exe
+--PowerPoint.exe
==========list()===========
QQ.exe
微信.exe
办公软件
组合模式使用场景
类似于一个树形结构,跟节点或者叶子结点都有相同的跟节点,可以将跟节点和叶子结点的相同属性抽离出来作为一个抽象类,跟节点和叶子结点分别继承相同的抽象类,分别实现不同的方法,这种情况下可以用组合模式来实现。