[工作中的设计模式]组合模式compnent
一、模式解析
将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和使用具有一致性。
组合模式的要点是:
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