组合模式:
组合模式又称为合成模式,有时又叫部分-整体模式是,主要用来描述部分和整体的关系
定义:
将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单一对象和组合对象的使用具有一致性
组合模式的三个角色
1.Component抽象构件角色
定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性,比如在27.组合模式1中getInfo就封装到抽象类里面了
2.Leaf叶子构件
叶子对象,其下再也没有其他的分支,也就是遍历的最小对象
3.Composite树枝构件
树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构
//抽象构件
public abstract class Component {
//个体和整体都共享
public voiod doSomething(){
//相关业务逻辑
}
}
组合模式的重点在于树枝构件
//树枝构件
public class Composite extends Component {
//构件容器
private ArrayList<Component> componentArrayList = new ArrayList();
//增加一个叶子构件或树枝构件
public void add (Component component){
this.componentArrayList.add(component);
}
//删除一个叶子构件或树枝构件
public void remove(Component component){
this.componentArrayList.remove(component);
}
//获得分支下的所有叶子构件和树枝构件
public ArrayList<Component> getChildren(){
return this.componentArrayList;
}
}
叶子节点没有子下级对象的对象,定义参加组合的原始对象行为
public class Leaf extends Component {
/*
*可以覆写父类的方法
*public void doSomething(){}
*
*/
}
场景类负责树状结构的建立,以及通过递归的方法遍历整个树
public class Client {
public static void main (String[] args){
//创建一个根节点
Composite root = new Composite();
root.doSomething();
//创建一个树枝构件
Composite branch = new Composite();
//创建一个叶子节点
Leaf leaf = new Leaf();
//建立结构
root.add(branch);
branch.add(leaf);
}
public static void display(Composite root){
for(Component c : root.getChildren()){
if(c instanceof Leaf){
c.doSomething();
}else{
display((Component)c);
}
}
}
}
组合模式的优点
1.高层模块调用简单
一颗树形结构中的所有节点都是Component,局部和整体对调用者来说都是没有任何区别的,也就是说高层模块不必关心自己处理的是单个对象还是整体组合结构,简化了高层模块的代码
2.节点自由增加
使用组合模式后,如果要增加树枝节点和树叶节点都很容易是,只要找到它的父节点就行了,符合开闭原则,对以后的维护非常有利
组合模式的缺点
组合模式有一个非常明显的缺点,在使用树枝和树叶的时候,我们是直接使用了实现类,这在面向接口编程来说是很不恰当的,与依赖倒置原则是相违背的,它会限制你接口的影响范围
组合模式的使用场景
1,维护和展示部分-整体关系的场景,如树形菜单,文件和文件夹管理等
2.从一个整体中能够独立出部分模块会功能的场景
注意事项
只要是树形结构,就应该考虑使用组合模式,这个一定要记住,只要是体现局部和整体关系的时候,而且这种关系还比较复杂的时候,就可以考虑使用组合模式