java实现Composite组合模式的实例代码

下面我将为你讲解Java实现Composite组合模式的实例代码完整攻略。在完成该过程前,我先将Composite组合模式的一些基本概念进行简单介绍。

Composite组合模式是一种结构化设计模式,用于将对象组合成树状结构,以表示“部分-整体”的层次关系。该模式使得客户端能够使用统一的接口处理单个对象以及对象组合,从而将单个对象与组合对象视为等同的对象。

接下来,我们来看一下Composite组合模式的实现步骤及其代码示例。

1. 定义组合模式接口及其实现类

首先,我们需要定义组合接口,其包括添加和删除节点,获取节点以及执行操作等方法。

public interface Component {
    void add(Component component);
    void remove(Component component);
    Component getChild(int index);
    void operation();
}

然后,我们再定义其实现类,包括叶节点和组合节点。

public class Leaf implements Component{
    @Override
    public void add(Component component) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void remove(Component component) {
        throw new UnsupportedOperationException();
    }

    @Override
    public Component getChild(int index) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void operation() {
        System.out.println("执行叶节点操作");
    }
}

public class Composite implements Component {
    private List<Component> components = new ArrayList<>();

    @Override
    public void add(Component component) {
        components.add(component);
    }

    @Override
    public void remove(Component component) {
        components.remove(component);
    }

    @Override
    public Component getChild(int index) {
        return components.get(index);
    }

    @Override
    public void operation() {
        System.out.println("执行组合节点操作");
        for(Component component : components) {
            component.operation();
        }
    }
}

2. 将对象组合成树状结构

接下来,我们可以通过将对象组合成树状结构来完成整体与部分间的层次关系。

Composite root = new Composite();
Composite component1 = new Composite();
Composite component2 = new Composite();
Leaf leaf1 = new Leaf();
Leaf leaf2 = new Leaf();

root.add(component1);
root.add(component2);
component1.add(leaf1);
component2.add(leaf2);

如上代码便构建了一棵树,root节点下包含component1和component2两个组合节点,而component1节点下又包含一个叶节点leaf1,component2包含一个叶节点leaf2。

3. 使用组合模式实现操作

利用Composite组合模式,我们可以使用相同的方式来操作单个对象和组合对象。

root.operation();

通过以上代码的执行,我们便可依次调用根节点以及其子节点的操作方法,从而实现对整棵树的操作。

示例说明

示例1. 文件系统演示

考虑一个应用场景,文件系统中的目录与文件可以使用Composite模式进行设计。目录可包含多个子目录或文件,而文件则为叶节点,无法再添加子节点。

public class Directory implements Component {
    private String name;
    private List<Component> children = new ArrayList<>();

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

    @Override
    public void add(Component component) {
        children.add(component);
    }

    @Override
    public void remove(Component component) {
        children.remove(component);
    }

    @Override
    public Component getChild(int index) {
        return children.get(index);
    }

    @Override
    public void operation() {
        System.out.println("当前目录为:" + name);
        for(Component component : children) {
            component.operation();
        }
    }
}

public class File implements Component {
    private String name;

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

    @Override
    public void add(Component component) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void remove(Component component) {
        throw new UnsupportedOperationException();
    }

    @Override
    public Component getChild(int index) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void operation() {
        System.out.println("当前文件为:" + name);
    }
}

创建一个文件系统并操作:

Directory root = new Directory("/");
Directory usr = new Directory("usr");
Directory opt = new Directory("opt");
File config = new File("config.txt");
File profile = new File("profile.txt");

root.add(usr);
root.add(opt);
usr.add(config);
opt.add(profile);

root.operation();

输出结果:

当前目录为:/
当前目录为:usr
当前文件为:config.txt
当前目录为:opt
当前文件为:profile.txt

示例2. 餐厅菜单演示

考虑一个应用场景,餐厅菜单的设计中可包含多个子菜单或菜品,每个菜品为叶节点,无法再添加子节点。

public abstract class MenuComponent {

    public void add(MenuComponent menuComponent) {
        throw new UnsupportedOperationException();
    }

    public void remove(MenuComponent menuComponent) {
        throw new UnsupportedOperationException();
    }

    public MenuComponent getChild(int index) {
        throw new UnsupportedOperationException();
    }

    public abstract String getName();
    public abstract String getDescription();
    public abstract double getPrice();
    public abstract boolean isVegetarian();
    public abstract void print();
}

public class MenuItem extends MenuComponent {
    private String name;
    private String description;
    private boolean vegetarian;
    private double price;

    public MenuItem(String name, String description, boolean vegetarian, double price) {
        this.name = name;
        this.description = description;
        this.vegetarian = vegetarian;
        this.price = price;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public String getDescription() {
        return description;
    }

    @Override
    public double getPrice() {
        return price;
    }

    @Override
    public boolean isVegetarian() {
        return vegetarian;
    }

    @Override
    public void print() {
        System.out.print("  " + getName());
        if (isVegetarian()) {
            System.out.print("(v)");
        }
        System.out.println(", " + getPrice());
        System.out.println("     -- " + getDescription());
    }
}

public class Menu extends MenuComponent {
    private List<MenuComponent> menuComponents = new ArrayList<>();
    private String name;
    private String description;

    public Menu(String name, String description) {
        this.name = name;
        this.description = description;
    }

    @Override
    public void add(MenuComponent menuComponent) {
        menuComponents.add(menuComponent);
    }

    @Override
    public void remove(MenuComponent menuComponent) {
        menuComponents.remove(menuComponent);
    }

    @Override
    public MenuComponent getChild(int index) {
        return menuComponents.get(index);
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public String getDescription() {
        return description;
    }

    @Override
    public void print() {
        System.out.print("\n" + getName());
        System.out.println(", " + getDescription());
        System.out.println("---------------------------");

        for (MenuComponent menuComponent : menuComponents) {
            menuComponent.print();
        }
    }
}

创建一个菜单并操作:

MenuComponent breakfastMenu = new Menu("Breakfast Menu", "All Day Breakfast");
MenuComponent lunchMenu = new Menu("Lunch Menu", "Delicious Lunch");
MenuComponent dinerMenu = new Menu("Dinner Menu", "Home Style Cooking");
MenuComponent dessertMenu = new Menu("Dessert Menu", "Desserts of the Day");

MenuComponent allMenus = new Menu("All Menus", "Combined Menus");

allMenus.add(breakfastMenu);
allMenus.add(lunchMenu);
allMenus.add(dinerMenu);
dinerMenu.add(new MenuItem("Vegetarian BLT", "(Fakin) Bacon with lettuce & tomato on whole wheat", true, 2.99));

allMenus.print();

输出结果:

All Menus, Combined Menus
---------------------------
Breakfast Menu, All Day Breakfast
---------------------------
Lunch Menu, Delicious Lunch
---------------------------
Dinner Menu, Home Style Cooking
  Vegetarian BLT(v), 2.99
---------------------------

通过以上示例可以看出,Composite组合模式的用法可适用于多种对象组合的场景,提供了一种简便的树形数据结构的设计方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现Composite组合模式的实例代码 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java解析XML详解

    Java解析XML详解 XML 概述 XML(Extensible Markup Language) 是一种标记语言,用于存储和传输数据。XML 文档由许多元素构成,每个元素包含一个开始标签、一个结束标签和其中间的一些内容。 XML 和 HTML 最大的不同在于,XML 的标签是自定义的,因此具有更强的灵活性和可扩展性。XML 通常用于将数据从一种格式转换为…

    Java 2023年5月19日
    00
  • WIN2003下IIS6集成一个或多个Tomcat的方法

    下面是WIN2003下IIS6集成一个或多个Tomcat的步骤详解,过程中会有两条示例,供参考: 1. 安装Tomcat 首先,在Windows服务器上安装一个或多个Tomcat实例。具体步骤如下: 下载Tomcat二进制文件并解压缩到任意目录(例如 D:\tomcat)。 配置Tomcat启动方式,可以使用Windows service或Startup保持…

    Java 2023年5月20日
    00
  • 作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    作为程序员必须掌握的Java虚拟机中的22个重难点攻略 Java虚拟机(JVM)是Java语言的核心,作为程序员必须深入了解JVM的原理和机制。本攻略介绍了JVM中的22个重难点,帮助程序员深入了解JVM并掌握JVM原理和调优技巧。 1. JVM 总论 JVM是Java的运行环境,它主要由类加载器、运行时数据区、执行引擎、本地接口、本地方法库和垃圾回收器组成…

    Java 2023年5月23日
    00
  • 快手挂小程序需要什么条件

    当你想在快手平台上挂载小程序时,需要以下条件: 1.小程序的认证 首先你必须有一个小程序,并且已经申请完成且审核通过了认证,可以进入微信公众平台 -> 开发 -> 认证管理 -> 小程序认证,完成认证。 2.具有快手小程序的开发权限 在进行快手小程序的挂载时,需要在快手官网申请成为快手小程序开发者,简单的流程可以是点击这个链接 快手小程序开…

    Java 2023年5月23日
    00
  • JS+Struts2多文件上传实例详解

    JS+Struts2多文件上传实例详解 简介 在现代web应用中,文件上传功能变得越来越常见。本文将介绍如何使用JavaScript和Struts2框架实现多文件上传功能。 实现步骤 1. 在HTML中创建上传表单 首先,在HTML页面中创建文件上传表单。使用<input>元素来创建上传表单并指定type=”file”。此外,我们还需在form元…

    Java 2023年5月20日
    00
  • java读取cvs文件并导入数据库

    敬爱的读者,首先感谢您对 Java 编程的热爱。关于如何从CSV文件中读取数据并将其导入数据库,本文将提供一个完整的攻略,详细介绍每个步骤。在本文中,我们将使用Java编写代码来实现该功能。 1. 准备CSV文件 首先,需要准备好包含数据的 CSV 文件。CSV 文件是一种纯文本格式,用于存储和交换以逗号、制表符、分号等分隔符隔开的数据。你可以使用 Micr…

    Java 2023年5月20日
    00
  • 简易的投票系统以及js刷票思路和方法

    简易的投票系统 本文将介绍如何搭建一个简易的投票系统,并且针对该投票系统介绍js刷票思路和方法。 投票系统原理 投票系统的原理非常简单,只需要记录每个用户对每个选手的投票数即可。在展示投票结果时,对每个选手的投票数进行累加,从而得出该选手的总得票数,从高到低排序就可以得出投票结果。 实现步骤 定义数据库表 创建一个votes表,表结构如下: 字段名 类型 说…

    Java 2023年6月15日
    00
  • java Disruptor构建高性能内存队列使用详解

    Java Disruptor构建高性能内存队列使用详解 Java Disruptor是一个Java内存队列(Memory Queue)框架,其可以高效地实现并发数据交换,以及与其他多线程系统的数据交换。在高性能计算、高并发、大吞吐量等场景下能够发挥出非常好的性能。本文将详细介绍如何使用Java Disruptor构建高性能内存队列。 原理介绍 Disrupt…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部