[工作中的设计模式]组合模式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
原文地址:https://www.cnblogs.com/jyyzzjl/p/5184475.html