定义:
组合多个对象形成树形结构以表 示“部分-整体”的结构层次。组合模式对单个对象(即叶子对象) 和组合对象(即容器对象)的使用具有一致性。
优点:
(1)可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次, 让客户端忽略了层次的差异,方便对整个层次结构进行控制
(2)客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码
(3)增加新的容器构件和叶子构件都很方便,符合开闭原则
(4) 为树形结构的面向对象实现提供了一种灵活的解决方案
缺点:
(1)设计更加抽象,对象的业务规则如果很复杂,实现组合模式具有较大难度。而且不是所有的方法都与叶子对象子类都有关联。
(2)在增加新构件时很难对容器中的构件类型进行限制
适用范围:
(1) 在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们
(2)在一个使用面向对象语言开发的系统中需要处理一个树形结构
(3)在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型
实例:
实例uml:
实例目录:
实例代码:
AbstractFile.java
package composite;
public abstract class AbstractFile {
public abstract void display();
}
Folder.java
package composite;
import java.util.ArrayList;
public class Folder extends AbstractFile{
ArrayList list=new ArrayList();
public void display(){
for (Object object:list){
((AbstractFile)object).display();
}
}
public void remove(AbstractFile abstractFile){
list.remove(abstractFile);
}
public void add(AbstractFile abstractFile){
list.add(abstractFile);
}
}
ImageFile.java
package composite;
public class ImageFile extends AbstractFile {
public void display(){
System.out.println("查看图片");
}
}
ViedoFile.java
package composite;
public class ViedoFile extends AbstractFile{
public void display(){
System.out.println("查看视频");
}
}
TextFile.java
package composite;
public class TextFile extends AbstractFile{
public void display(){
System.out.println("查看文本");
}
}
Client.java
package composite;
public class Client {
public static void main(String[] args) {
AbstractFile file1,file2,file3,file4,file5;
file1=new ImageFile();
file2=new TextFile();
file3=new ViedoFile();
Folder folder1=new Folder();
Folder folder2=new Folder();
folder1.add(file1);
folder1.add(file2);
folder2.add(folder1);
folder2.add(file3);
folder2.display();
System.out.println("软件1928 2019006175");
}
}
运行结果截图: