目录
- 组合模式(Composite)
- 适用场景
- 组合模式实例代码(Java)
组合模式(Composite)
将对象组合成树型结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
适用场景
- 想表示对象的部分-整体层次结构。
- 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
✦ Component为组合中的对象声明接口;在适当情况下实现所有类共有接口的默认行为:声明一个接口用于访问和管理Component的子组件;(可选)在递归结构中定义一个接口,用于访问一个父组件,并在合适的情况下实现它。
✦ Leaf在组合中表示叶结点对象,叶结点没有子结点;在组合中定义图元对象的行为。
✦ Composite定义有子组件的那些组件的行为;存储子组件;在Component接口中实现与子组件有关的操作。
✦ Client通过Component接口操纵组合组件的对象。
组合模式实例代码(Java)
import java.util.*;
//抽象组合文件——对应Component
abstract class AbstractFile {
protected String name;
public void printName() {
System.out.println(name);
}
//添加子组件
public abstract boolean Add(AbstractFile file);
//删除子组件
public abstract boolean Remove(AbstractFile file);
public abstract List<AbstractFile> getChild();
}
//文件夹——对应Composite
class Folder extends AbstractFile {
//Composite可以存储子组件
private List<AbstractFile> childrenList = new ArrayList<AbstractFile>();
public Folder(String name) {
this.name = name;
}
@Override
public boolean Add(AbstractFile file) {
return childrenList.add(file);
}
@Override
public boolean Remove(AbstractFile file) {
return childrenList.remove(file);
}
@Override
public List<AbstractFile> getChild() {
return childrenList;
}
}
//文件——对应Leaf
class File extends AbstractFile {
public File(String name) {
this.name = name;
}
@Override
public boolean Add(AbstractFile file) {
return false;
}
@Override
public boolean Remove(AbstractFile file) {
return false;
}
@Override
public List<AbstractFile> getChild() {
return null;
}
}
public class CompositeMain {
public static void main(String[] args) {
// 父类名 对象名 = new 子类名();
AbstractFile root = new Folder("root");
AbstractFile folderA = new Folder("folderA");
AbstractFile folderB = new Folder("folderB");
AbstractFile fileC = new File("fileC");
AbstractFile fileD = new File("fileD");
AbstractFile fileE = new File("fileE");
root.Add(folderA);
root.Add(folderB);
root.Add(fileC);
folderA.Add(fileD);
folderA.Add(fileE);
print(root);
}
static void print(AbstractFile file) {
file.printName();
List<AbstractFile> childrenList = file.getChild();
if (childrenList == null) {
return;
}
// for (对象类型 对象名 : 遍历对象)
for (AbstractFile children : childrenList) {
// children.printName();
print(children);
}
}
}
其他设计模式详见本专栏其他博文~
特别感谢zst_2001在备考软考期间提供的帮助,贴上博主B站
zst_2001的个人空间