1.意图
将对象组合成树形结构以表示“部分-整体”的层次结构,composite使得用户对
单个对象和组合对象的使用具有一致性。
2.参与者
component -为组合中的对象声明接口
-在适当的情况下,实现所有类共有接口的缺省行为
-声明一个接口用于访问和管理component的子组件
-(可选)在递归结构中定义一个接口,用于访问父
部件,并在合适的情况下实现它
Leaf -在组合中表示叶节点对象
-在组合中定义图元对象的行为
composite -定义由子部件的那些部件的行为
-存储子部件
-在component接口中实现与子部件相关的操作
3.结构
4.代码
public abstract class Component {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
abstract void add(Composite c);
abstract void remove();//移除当前节点
abstract void removeAll();//移除当前节点和其后代节点
abstract void setFather(Composite c);
abstract List<Composite> getChilds();
abstract Component getFather();
abstract Iterator<Composite> createIterable();
abstract void Traversal();
}
public class Composite extends Component {
private List<Composite> child;//当child == null时Composite为Leaf
private Composite father;
@Override
void add(Composite c) {
if (child == null) {
child = new LinkedList<Composite>();
}
c.setFather(this);
child.add(c);
}
@Override
void remove() {
if(father != null){
for(Composite composite:child){
composite.setFather(father);
father.getChilds().add(composite);
}
father.getChilds().remove(this);
}
}
@Override
Iterator<Composite> createIterable() {
return child.iterator();
}
@Override
void removeAll() {
if(father != null){
father.getChilds().remove(this);
}
}
@Override
void setFather(Composite c) {
this.father = c;
}
@Override
Component getFather() {
return father;
}
@Override
List<Composite> getChilds() {
return child;
}
@Override
void Traversal() {
System.out.println(this.getName());
if(child != null){
for(Composite c:child){
c.Traversal();
}
}
}
}
public static void main(String[] args) {
// 创建根节点
Composite root = new Composite();
root.setName("中国");
// 创建省节点
Composite jx = new Composite();
jx.setName("江西省");
Composite gd = new Composite();
gd.setName("广东省");
// 创建市节点
Composite gz = new Composite();
gz.setName("广州市");
Composite qy = new Composite();
qy.setName("清远市");
Composite ja = new Composite();
ja.setName("吉安市");
Composite nc = new Composite();
nc.setName("南昌市");
gd.add(gz);
gd.add(qy);
jx.add(ja);
jx.add(nc);
root.add(gd);
root.add(jx);
// 层次遍历
/*Composite visitor = null;
Queue<Composite> q = new LinkedBlockingDeque<Composite>();
q.add(root);
while (!q.isEmpty()) {
visitor = q.poll();
System.out.println(visitor.getName());
List<Composite> childs = visitor.getChilds();
if(childs != null){
q.addAll(visitor.getChilds());
}
}*/
//gd.Traversal();
gd.removeAll();
root.Traversal();
}
}