介绍
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
类图说明
类图描述如下:
Component类:定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性,本类图中定义一个共有的方法doSomething()。
Leaf类:叶子对象,其下再也没有其他的分支,也就是遍历的最小单位,实现doSomething()方法即可。
Composite类:树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构。本类图中定义add()和remove()以及getChild()方法。
CompositePattern类:定义调用对象。
代码示例
文件结构如下:
代码示例如下:
public abstract class Component {
public void doSomething(){
}
}
public class Leaf extends Component {
@Override
public void doSomething() {
System.out.println("i am a leaf");
}
}
public class Composite extends Component {
private List<Component> list = new ArrayList<>();
public void add(Component component){
list.add(component);
}
public void remove(Component component){
list.remove(component);
}
public List<Component> getChild(){
return this.list;
}
@Override
public void doSomething() {
System.out.println("i am composite");
}
}
public class CompositePattern {
public static void main(String[] args) {
Composite composite = new Composite();
Leaf leaf = new Leaf();
composite.add(leaf);
composite.add(leaf);
composite.doSomething();
for (Component c:composite.getChild()) {
c.doSomething();
}
}
}
运行结果如下:
应用场景
部分、整体场景,如树形菜单,文件、文件夹的管理
优缺点
优点
- 高层模块调用简单
- 节点自由增加
缺点
- 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则