组合模式(Composite Pattern)
- 组合模式(Composite Pattern)
- 组合模式概述
- 组合模式涉及的角色
- talk is cheap, show you my code
- 总结
组合模式(Composite Pattern)
组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次关系。组合模式使得客户代码可以统一地处理单个对象和对象组合,即无论是叶子节点还是包含其他组件的容器节点,都可以以相同的方式进行操作。
有点抽象
简单点说就是这种设计经常用于树形结构,为了简化代码,使用Composite可以把一个叶子节点与一个父节点统一起来处理。
比如家谱,我们就能明显看出层次结构。而且我们可以任意选一个人作为祖宗节点,这样选了任何一个人为祖宗的时候,都能拉出一份相似的层次结构。
组合模式概述
- 定义: 组合多个对象形成树状结构以表示“部分-整体”的层次结构。组合模式让客户端可以一致地使用单个对象和组合。
- 目的: 简化客户端代码对复杂层次结构的操作,同时保持良好的扩展性和灵活性。
组合模式涉及的角色
- Component(组件接口):定义组合中的对象的行为接口,声明一个公共接口用于访问及管理其子组件。可以是抽象类或接口。
- Leaf(叶对象):在组合中表示叶子节点对象,叶子节点没有子节点。
- Composite(组合对象):在组合中表示容器对象,可以包含子组件,并可以在子组件上执行组合操作。
talk is cheap, show you my code
我们还是通过把我们举得那个案例转化成代码从而方便我们了解组合设计模式
- 组件(Component), 这个地方我们因为使用家谱信息,所以我们定义结构名为Family
public interface Family{
// 所有组件都应实现的基本操作 我们这个案例主要指的是展示从自己开始的家族信息
void show();
}
- 叶子(Leaf),这个地方指的是具体的一个个子Family
public class Afamily implements Family{
@Override
public void show() {
System.out.println("Afamily");
}
}
public class Bfamily implements Family{
@Override
public void show() {
System.out.println("Bfamily");
}
}
- 组合(Composite),代表树形结构中的非终端节点,它可以包含零个或多个子组件,因为组合也实现了对应的接口,所以组合不光可以加叶子节点,还可以把其他的组合添加到另一个组合中去。
public class FamilyComposite implements Family{
private List<Family> children = new ArrayList<>();
@Override
public void show() {
System.out.println("show my family");
for (Family child : children) {
child.show();
}
}
public void add(Family family) {
children.add(component);
}
public void remove(Family family) {
children.remove(component);
}
public List<Family> getChildren() {
return children;
}
}
总结
组合模式优点:
- 一致性:客户端可以一致地对待单个对象和组合对象,不需要关心它们的具体类型。
- 灵活性:很容易通过组合模式构建复杂的树形结构,并且可以在不影响现有代码的情况下增加新的组件。
- 符合开闭原则:当需要添加新类型的组件时,只需创建一个新的叶子或组合类,而无需修改现有的代码。
- 易于扩展:由于每个组件都是独立的,因此可以很容易地为特定类型的组件添加新的行为或属性。
应用场景:
- 文件系统:如操作系统中的目录和文件,其中目录可以包含其他目录或文件,而文件是终端节点。
- 图形界面设计:例如窗口中的菜单项,菜单本身可能包含子菜单或具体的菜单选项(叶子)。
- 组织架构:如公司内部的部门和员工,部门可以包含子部门或其他员工。
- 文档编辑器:如文本块、段落、章节等,其中章节可以包含多个段落,段落又可以包含多个文本块。
组合模式是一个非常有用的设计模式,特别是在需要处理具有层次结构的数据时。它可以帮助开发者更好地组织代码,提高系统的灵活性和可扩展性。其实我们平时解析Xml的过程中,就有组合模式,因为Xml实际上也是一颗树结构。如果有兴趣的同学可以去阅读一下解析XML的库函数的源码。