Java设计模式应用——组合模式

组合模式实际上是一种树形数据结构。以windows目录系统举例,怎么样用java语言描述一个文件夹?

定义一个文件夹类,文件夹类中包含若干个子文件类和若干个文件类。

进一步抽象,把文件夹和文件都看做节点,于是一个文件夹就可以描述为一个节点类,包含若干个子节点。

我们看看组合模式的代码

// 抽象节点
public abstract class Node
{
    protected String name;
    abstract void add(Node node);
    abstract void removed(Node node);
    abstract void foreach();

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }
}

// 文件类
public class File extends Node
{
    @Override
    void add(Node node)
    {
    }

    @Override
    void removed(Node node)
    {
    }

    @Override
    void foreach()
    {
        System.out.println("File name is " + name);
    }

    public File(String name)
    {
        this.name = name;
    }
}

// 文件夹类
import java.util.ArrayList;
import java.util.List;

public class Folder extends Node
{
    List<Node> nodes = new ArrayList<Node>();

    @Override
    void add(Node node)
    {
        nodes.add(node);
    }

    @Override
    void removed(Node node)
    {
        nodes.remove(node);
    }

    @Override
    void foreach()
    {
        System.out.println("Folder name is " + name);
        for(Node node : nodes)
        {
            node.foreach();
        }
    }

    public Folder(String name)
    {
        this.name = name;
    }
}

测试类

package com.coshaho.learn.component;

public class Test
{
    public static void main(String[] args)
    {
        Folder root = new Folder("Root");
        Folder music = new Folder("Music");
        Folder software = new Folder("Software");
        root.add(music);
        root.add(software);
        File explain = new File("explain.txt");
        File moon = new File("moon.mp3");
        File word = new File("word.exe");
        root.add(explain);
        music.add(moon);
        software.add(word);
        root.foreach();
    }
}

在实际应用中,我们希望使用json传递树形结构数据,我们希望每层节点定义都一样,不通过类来区分叶子节点和非叶子节点。这个时候我们可以简单的在Node对象中增加一个isLeaf属性,用来表示该节点是否是叶子节点。这种数据结构是一种递归结构,可以使用递归算法解析。

package com.coshaho.learn.component;

import java.util.ArrayList;
import java.util.List;

import org.springframework.util.CollectionUtils;

public class TreeNode
{
    private String name;

    private boolean isLeaf;

    private List<TreeNode> nodes = new ArrayList<TreeNode>();

    private TreeNode(String name, boolean isLeaf)
    {
        this.name = name;
        this.isLeaf = isLeaf;
    }

    void add(TreeNode node)
    {
        nodes.add(node);
    }

    void removed(TreeNode node)
    {
        nodes.remove(node);
    }

    public String toString()
    {
        String nameInfo = "name: " + name;
        String typeInfo = "isLeaf: " + isLeaf;
        String value ="";
        if(isLeaf || CollectionUtils.isEmpty(nodes))
        {
            value = "{" + nameInfo + "," + typeInfo + "}";
        }
        else
        {
            String childrenInfo = "children: [";
            for(TreeNode node : nodes)
            {
                childrenInfo = childrenInfo + node.toString() + ",";
            }
            childrenInfo = childrenInfo.substring(0, childrenInfo.length() - 1) + "]";
            value = "{" + nameInfo + "," + typeInfo + "," + childrenInfo + "}";
        }
        return value;
    }

    public static void main(String[] args)
    {
        TreeNode all = new TreeNode("All", false);
        TreeNode guangdong = new TreeNode("GuangdDong", true);
        TreeNode sichuan = new TreeNode("SiChuan", false);
        TreeNode chengdu = new TreeNode("ChengDu", true);
        all.add(guangdong);
        all.add(sichuan);
        sichuan.add(chengdu);
        System.out.println(all);
    }
}
时间: 2024-10-07 06:30:55

Java设计模式应用——组合模式的相关文章

图解Java设计模式之组合模式

图解Java设计模式之组合模式 看一个学校院系展示需求 传统方案解决学院院系展示(类图) 传统方案解决学校院系展示存在的问题分析 组合模式基本介绍 组合模式的原理类图 组合模式解决学校院系展示的应用实例 组合模式在JDK集合的源码分析 组合模式的注意事项和细节 看一个学校院系展示需求 编写程序展示一个学校院系结构 :需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系.如图 : 传统方案解决学院院系展示(类图) 传统方案解决学校院系展示存在的问题分析 1)将学院看

java设计模式之组合模式

树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构或者树形结构的一部分,也可以一致性地处理树形结构中的叶子节点(不包含子节点的节点)和容器节点(包含子节点的节点).下面将学习这种用于处理树形结构的组合模式. 11.1 设计杀毒软件的框架结构 Sunny软件公司欲开发一个杀毒(AntiVirus)软件,该软件既可以对某

java设计模式5.组合模式、门面模式、享元模式、桥接模式

组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独的成分对象和由它们组合而成的合成对象同等看待. 抽象构建角色:一个抽象角色,给参加组合的对象规定一个接口,这个接口给出共有的接口及默认行为. 树叶构建角色:代表参加组合的树叶对象,没有子对象,定义参加组合的原始对象行为. 树枝构建角色:代表参加组合的有子对象的对象,并给出树枝构件对象的行为. 对于子

JAVA设计模式:组合模式

组合(总体与部分关系)模式:将不同可是相关的对象组合成树形结构以实现"部分-总体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. * 模式角色组成: * 1.Component对象: 是组合中的对象接口,是全部类共同拥有的接口.是用于统一定义总体中的部分. 2.Leaf对象: 总体中的部分,没有下一级. 3.Composite对象: 用来存储子部件.在Component接口中实现与部分有关操作. 以公司构成为例,比方公司有总公司.总公司下有分公司,分公司下有办事处等.构成一

浅谈JAVA设计模式之——组合模式(Composite)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45458081 一.概述 将对象组合成树形结构以表示"部分-整体"的层次结构."Composite使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 1.你想表示对象的部分-整体层次结构. 2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象. 三.参与者 1.Component 为组合中的对象声明接口. 在适当的情况下,实现

java设计模式_组合模式

/**  *   */ package com.wangbiao.design.composite; import java.util.ArrayList; import java.util.List; /**  * @Title: Component.java  * @Package com.wangbiao.design.composite  * @Description: TODO   * @author wangbiao     * @date 2014-9-28 上午9:50:26 

java设计模式------装饰着模式

java设计模式-------装饰者模式 装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案.主要有组件(components)和装饰器(Decorator)组成.要求components和Decorator实现相同的接口或者抽象类(具体类的局限性太大). 设计原则.模式特点.适用性 - 1. 多用组合,少用继承. 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为.然而,如果能够利用

Java设计模式——装饰者模式

JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式. 结构 图-装饰者模式结构图 Component : 定义一个对象接口,可以给这些对象动态地添加职责. interface Component {     public void operation(); } ConcreteComponent : 实现 Component 定义的接口. clas

设计模式之组合模式(Composite)

1.定义 组合模式(Composite Pattern)也叫合成模式,将对象组合成树形结构以表示"整体-部分"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 2.通用类图 Component抽象构件角色:定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性. Leaf叶子构件:叶子对象,其下再也没有其他的分支,也就是遍历的最小单位. Composite树枝构件:树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构. 3.通用源代码 package Compo