将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦,组合模式让你可以优化处理递归或分级数据结构。
实例:目录结构、网站导航
Component
抽象的部件类描述将来所有部件共有的行为,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件
package com.zndroid.dm.CompositionModel;
/**
* Created by luzhenyu on 2017/9/5.
*/
/**抽象的部件类描述将来所有部件共有的行为,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件*/
public abstract class Component {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void addComponent(Component component);
public abstract void removeComponent(Component component);
public abstract void eachComponent();
}
Composite
组合类 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作
package com.zndroid.dm.CompositionModel.impl;
/**
* Created by luzhenyu on 2017/9/5.
*/
import com.zndroid.dm.CompositionModel.Component;
import java.util.ArrayList;
import java.util.List;
/**组合类 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作*/
public class Composite extends Component{
private List<Component> list = new ArrayList<>();//用来存储组合的部件
@Override
public void addComponent(Component component) {
list.add(component);
}
@Override
public void removeComponent(Component component) {
list.remove(component);
}
@Override
public void eachComponent() {
System.out.println(getName() + " was traversed");
for (Component e: list) {
e.eachComponent();
}
}
}
Leaf
叶子组件在组合中表示叶子结点对象,叶子结点没有子结点 不具有add remove属性
package com.zndroid.dm.CompositionModel.impl;
import com.zndroid.dm.CompositionModel.Component;
/**
* Created by luzhenyu on 2017/9/5.
*/
/**叶子组件在组合中表示叶子结点对象,叶子结点没有子结点 不具有add remove属性*/
public class LeafComponent extends Component {
//叶子节点不具备添加组件的能力,所以不实现
@Override
public void addComponent(Component component) {
}
//叶子节点不具备添加组件的能力,所以不实现
@Override
public void removeComponent(Component component) {
}
@Override
public void eachComponent() {
System.out.println(getName() + " was traversed");
}
}
具体使用:
/**
* 组合模式
* 将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性
* 模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦
* 组合模式让你可以优化处理递归或分级数据结构
* 实例:目录结构、网站导航
* 优点:1、高层模块调用简单。 2、节点自由增加。
* 缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
* */
//结构类似:
//根节点 |--
// 根节点1 |--
// 叶子节点11
// 叶子节点12
// 根节点2 |--
// 叶子节点21
Component root1 = new Composite();
root1.setName("根节点1");
Component leaf11 = new LeafComponent();
leaf11.setName("根节点1 - 叶子节点1");
Component leaf12 = new LeafComponent();
leaf12.setName("根节点1 - 叶子节点2");
root1.addComponent(leaf11);
root1.addComponent(leaf12);
Component root2 = new Composite();
root2.setName("根节点2");
Component leaf21 = new LeafComponent();
leaf21.setName("根节点2 - 叶子节点1");
root2.addComponent(leaf21);
Component root = new Composite();
root.setName("根节点");
root.addComponent(root1);
root.addComponent(root2);
root.eachComponent();
log("----------------我是分割线-----------------");
【欢迎上码】
【微信公众号搜索 h2o2s2】