一、模式解析
将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和使用具有一致性。
组合模式的要点是:
1、对象整体以树形层次结构进行展示
2、树的根节点和子节点均可以添加删除子节点,叶子节点无子节点
3、可以通过节点的行为动作调用并展示他所有自己点的行为
4、为了方便的实现无限节点的扩展,我们通常定义一个公共的接口,所有子节点和叶子节点均实现此接口
二、模式代码
1、公共接口,供所有子节点和叶子节点实现
package component.patten; public abstract class Component {
protected String name;
public Component(String name){
this.name=name;
}
public abstract void add(Component component);
public abstract void remove(Component component);
public abstract void display(int deepth); }
2、叶子节点
package component.patten; import java.util.ArrayList;
import java.util.List; public class Composite extends Component {
public Composite(String name) {
super(name);
} List<Component> list=new ArrayList<Component>(); @Override
public void add(Component component) {
list.add(component);
} @Override
public void remove(Component component) {
list.remove(component);
} @Override
public void display(int deepth) {
System.out.println(this.name);
//叶子节点的方法可以调用展示所有他的子节点的方法
for(Component component:list){
StringBuffer buffer=new StringBuffer();
for (int i = 0; i < deepth; i++) {
buffer.append("--");
}
System.out.print(buffer);
component.display(deepth+1);
}
} }
3、叶子节点,叶子节点并不实现增加和删除方法,但是因为集成了接口,所以必须有
package component.patten; public class Leaf extends Component { public Leaf(String name) {
super(name);
} @Override
public void add(Component component) {
// TODO Auto-generated method stub
} @Override
public void remove(Component component) {
// TODO Auto-generated method stub } @Override
public void display(int deepth) {
System.out.println("--"+this.name);
} }
4、客户端代码
package component.patten; public class Client {
public static void main(String[] args) {
Component root=new Composite("root");
Component com1=new Composite("com1");
root.add(com1);
Component leaf1=new Leaf("leaf1");
Component leaf2=new Leaf("leaf2");
Component leaf3=new Leaf("leaf3");
com1.add(leaf1);
com1.add(leaf2);
com1.add(leaf3); Component com2=new Composite("com2");
root.add(com2);
Component leaf4=new Leaf("leaf2");
com2.add(leaf4); root.display(1);
}
}
5、执行结果
root
--com1
------leaf1
------leaf2
------leaf3
--com2
------leaf2
三、应用场景
组合模式主要解决树形结构问题,比如集团与分子公司,电脑系统的文件夹和文件系统,系统中多级菜单,java集合框架中的List等方面进行使用,主要的要点就是对层级关系的添加和对子集信息的展示,以文件夹系统进行举例。
四、场景代码
1、定义文件的节点
package component.example; import java.util.ArrayList;
import java.util.List; public abstract class Node {
protected String name;
protected List<Node> list=new ArrayList<Node>();
public Node(String name){
this.name=name;
}
public abstract void add(Node node) throws Exception;
public abstract void remove(Node node) throws Exception;
public abstract void display(String path);
}
2、定义文件夹
package component.example; /**
* 文件夹
* @author zjl
* @time 2016-2-2
*
*/
public class Folder extends Node { public Folder(String name) {
super(name);
} @Override
public void add(Node node) {
list.add(node);
} @Override
public void remove(Node node) {
list.remove(node);
} @Override
public void display(String path) {
path+="/"+this.name;
for(Node node:list){
node.display(path);
}
} }
3、定义文件
package component.example; public class File extends Node { public File(String name) {
super(name);
} @Override
public void add(Node node) throws Exception {
throw new Exception("不支持此方法");
} @Override
public void remove(Node node) throws Exception {
throw new Exception("不支持此方法");
} @Override
public void display(String path) {
System.out.println(path+"/"+this.name);
} }
4、客户端
package component.example; public class Client {
public static void main(String[] args){
Folder document = new Folder("我的资料"); //我的资料文件夹
File book = new File("Java编程思想.pdf"); //文档文件
Folder music = new Folder("我的音乐"); //我的音乐文件夹
File music1 = new File("你是我的眼.mp3"); //音乐文件1
File music2 = new File("Without You.mp3"); //音乐文件2
//确定树形结构关系
document.add(book);
document.add(music);
music.add(music1);
music.add(music2); document.display(""); }
}
5、运行结果
/我的资料/Java编程思想.pdf
/我的资料/我的音乐/你是我的眼.mp3
/我的资料/我的音乐/Without You.mp3