所谓组合模式,即反映部分与整体的关系。使得用户按照同样的方式操作单个对象和对象组合。
举个例子:我们要实现一棵树,那么这棵树就是整体,而树又是又子树构成,子树又由子子树构成。那么树中的两大部分:1.叶子节点 2.子树,即节点的集合。
我们可以知道,对于子树而言,应该有添加功能(增加一个节点),删除功能(删除一个节点),以及显示功能(方便测试)。那么对于叶子节点而言,我们也为它上这三个功能,虽然叶子节点没有add和remove,但是为了保持与子树(节点集合)代码的一致性,我们也让它拥有这三个方法。所以子树和叶子节点,都继承至一个抽象类Component,这个抽象类定义了这三个方法:add、remove和display。
Component是个抽象类,代码如下:
package com.SmsTest.Test;
/*
* author:Tammy Pi
* function:组合模式的抽象类
*/
public abstract class Component {
public void addComponent(Component comp) {
}
public void removeComponent(Component comp){
}
public void displayComponent(){}
}
而Leaf类继承至Component类,其addComponent方法和removeComponent方法没用,只是用于保持一致:
package com.SmsTest.Test;
/*
* author:Tammy Pi
* function:组合模式的叶子节点
*/
public class Leaf extends Component{
private String name;
public Leaf(String name){
this.name = name;
}
//叶子节点不具有添加的功能
public void addComponent(Component cmp){
System.out.println("叶子节点不具有添加的功能!");
}
//叶子节点不具有移除的功能
public void removeComponent(Component cmp){
System.out.println("叶子节点不具有移除的功能!");
}
//显示
public void displayComponent(){
System.out.println(this.name);
}
}
再就是集合类,包括Component的集合:
package com.SmsTest.Test;
import java.util.*;
/*
* author:Tammy Pi
* function:组合模式的组合对象
*/
public class Composite extends Component{
private List<Component> list = new ArrayList<Component>();
private String name;
public Composite(String name){
this.name = name;
}
public void addComponent(Component comp) {
list.add(comp);
}
public void removeComponent(Component comp){
list.remove(comp);
}
public void displayComponent(){
System.out.println(this.name);
for(int i=0;i<list.size();i++){
System.out.print("--");
list.get(i).displayComponent();
}
}
}
最后就是对组合模式的测试:
package com.SmsTest.Test;
public class TestComposite {
public static void main(String[] args){
Component root = new Composite("树根");
Component lroot = new Composite("左子树");
Component rroot = new Composite("右子树");
Component lLeaf1 = new Leaf("左子树叶子节点1");
Component lLeaf2 = new Leaf("左子树叶子节点2");
Component rLeaf1 = new Leaf("右子树叶子节点1");
Component rLeaf2 = new Leaf("右子树叶子节点2");
lroot.addComponent(lLeaf1);
lroot.addComponent(lLeaf2);
rroot.addComponent(rLeaf1);
rroot.addComponent(rLeaf2);
root.addComponent(lroot);
root.addComponent(rroot);
root.displayComponent();
}
}
结果如下:
树根
--左子树
--左子树叶子节点1
--左子树叶子节点2
--右子树
--右子树叶子节点1
--右子树叶子节点2