组合模式,又叫做“部分-整体模式”,它属于结构型设计模式,创建了对象组的树形结构。
定义:将对象组合成树形结构以表示“部分-整体”的层次关系,使得用户在对单一对象和组合对象的使用具有一致性。
问题描述:构建一个树形结构的复杂对象,并能区分部分和整体的差异,且用户可以一致性地对它们进行操作。
解决方案:抽象出容器类和叶子类的共有的行为和方法,并分别去实现。
结构图:
举个栗子:讲一个总公司、分公司和子公司的故事。。。
总公司由若干个分公司组成,分公司又由若干个子公司组成,总公司、分公司和子公司所共有的行为由添加属下公司、解除属下公司、批量添加属下公司和批量解除属下公司,将这四种行为抽象出来并分别去操作和实现。具体实现方式如下:
1. 抽象构件类Company,包含公司类的共有方法。代码如下:
2. 具体容器类HeadOffice(总公司)和BranchOffice(分公司),分别重写父类Company中定义的方法。代码如下:
3. 叶子节点类SubOffice,注意它没有子节点,所以它不需要去重写父类中的方法。代码如下:
4. 在类CompositeFragment中分别实例化各个对象的实例,然后进行相应的操作。核心代码如下:
5. 运行后的效果如下:
综上,容器类及其叶子类的使用方法完全一致,并且新增叶子类和容器类也很方便。
优点:
1. 高层模块调用简单;
2. 节点自由增加。
缺点:
1. 不能限制容器下的叶子类型,因为所有的容器和叶子都继承自一个父类或依赖于一个接口;
2. 容器和叶子的声明都是实现类,而不是接口,违反了依赖倒置原则。
适用场景:
1. 表示对象的部分-整体的层次结构;
2. 忽略单个对象和组合对象的不同,希望统一使用它们。