结构型模式--组合模式(Composite)
组合模式有时又叫部分-整体模式在处理类似树形结构的问题时比较方便,看看关系图:
对象通过实现(继承)统一的接口(抽象类),调用者对单一对象和组合对象的操作具有一致性
直接来看代码:
[java] view plaincopy
- public class TreeNode {
- private String name;
- private TreeNode parent;
- private Vector<TreeNode> children = new Vector<TreeNode>();
- public TreeNode(String name){
- this.name = name;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public TreeNode getParent() {
- return parent;
- }
- public void setParent(TreeNode parent) {
- this.parent = parent;
- }
- //添加孩子节点
- public void add(TreeNode node){
- children.add(node);
- }
- //删除孩子节点
- public void remove(TreeNode node){
- children.remove(node);
- }
- //取得孩子节点
- public Enumeration<TreeNode> getChildren(){
- return children.elements();
- }
- }
[java] view plaincopy
- public class Tree {
- TreeNode root = null;
- public Tree(String name) {
- root = new TreeNode(name);
- }
- public static void main(String[] args) {
- Tree tree = new Tree("A");
- TreeNode nodeB = new TreeNode("B");
- TreeNode nodeC = new TreeNode("C");
- nodeB.add(nodeC);
- tree.root.add(nodeB);
- System.out.println("build the tree finished!");
- }
- }
使用场景:将多个对象组合在一起进行操作,常用于表示树形结构中,例如二叉树,数等。
2=====================================================
interface Node{
public void copy(); //定义统一的接口:复制
}
class Folder implements Node{
private String folderName;
private ArrayList nodeList =new ArrayList(); //用于存储文件夹下的文件夹或文件的信息
public Folder(String folderName){
this.folderName = folderName;
}
public void add(Node node){ //增加文件或文件夹
nodeList.add(node);
}
public void copy(){ //文件夹复制操作实现递归
System.out.println("复制文件夹:" + folderName);
for(int i=0;i
Node node = (Node)nodeList.get(i);
node.copy();
}
}
}
class File implements Node{
private String fileName;
public File(String fileName){
this.fileName = fileName;
}
public void copy(){
System.out.println("复制文件:" + fileName);
}
}
public class Composite{
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.copy(); //复制“我的资料”文件夹,递归地复制了其下所有文件夹和文件。
}
}
运行结果如下:
- 复制文件夹:我的资料
- 复制文件:Java编程思想.pdf
- 复制文件夹:我的音乐
- 复制文件:你是我的眼.mp3
- 复制文件:Without You.mp3