组合模式我们经常说到,实际上就是允许你把一个对象组合成树结构,以表示“整体/局部”层次。文章将从复合模式的定义、包含角色、通用源码及优缺点等几个方面进行详细分析,帮助您深入理解Java设计模式的组合模式。
一、组合模式定义。
它是一种常见的设计模式(但是我觉得有一点复杂)也被称为合成模式,有时也称为部分-整体模式,主要用于描述各部分和整体之间的关系。合成方式是把零件组装成一个整体。把物体组合成树结构来代表“部分-整体”的层次结构,这样用户就可以在单一对象和组合对象上保持一致。
二,复合模式的内含角色:
(1)组件抽象工件角色。
用普通的方法和属性来定义参加复合的对象,可以定义某些缺省行为。
(2)Leaf叶组件。
叶对象,在它下面不再有分支,即遍历中最小的单元。
(3)Composite树枝构件。
枝条对象,作用是将枝条节点与叶子节点结合成一个树结构。
三、通用源代码:
(1)抽象构件
public abstract class Component {
//个体和整体都具有的共享
public void doSomething(){
//编写业务逻辑
}
}
(2)树枝构件
public class Composite extends Component {
//构件容器
private ArrayList componentArrayList = new ArrayList()
//增加一个叶子构件或树枝构件
public void add(Component component){
this.componentArrayList.add(component);
}
//删除一个叶子构件或树枝构件
public void remove(Component component){
this.componentArrayList.remove(component);
}
//获得分支下的所有叶子构件和树枝构件
public ArrayList getChildren(){
return this.componentArrayList;
}
}
树叶节点是没有子下级对象的对象,定义参加组合的原始对象行为。
(3)树叶构件
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((Composite)c);
}
}
}
}
四、组合模式的好处:
(1)较高的模块调用。
树形机构中的所有节点都是组件,而本地和全局对于调用方并无差别,即,高层模块无需关心自己是处理单一对象还是整个组合结构,从而简化高层模块的代码。
(2)增加节点的自由。
在采用组合方式之后,我们可以看到,如果想要增加一个枝条节点,是否都很简单,只要找到其父节点即可,非常容易扩展,符合开闭原理,非常有利于以后的维护。
五、组合模式的缺点:
在场景类中,组合模式还有一个很明显的缺点,那就是如何定义场景类中的叶子和枝条的定义?实现类,直接使用!这种方法不适合于面向界面的编程,与依赖倒置原则相冲突,读者在使用时要考虑清楚,它限制了界面的影响力。
使用场景:
(1)维护并呈现“局部-整体”的关系,比如树式菜单、文件和文件夹管理。
(2)方案可以从整体中分离出部分模块或功能。
简单地说,组合方式能充分体现局部与整体关系,既有优点也有不足之处,但总体上还是非常方便实用的。大家都搞明白了上面对组合模式的深度解析吗?