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实现动态图片效果

    Java实现动态图片效果攻略 动态图片效果可以为网站增加互动性和吸引力,Java作为一门强大的编程语言,可以实现多种动态图片效果。本文将介绍Java实现动态图片效果的完整攻略。 构建Java Web项目 首先,需要在本地计算机上安装JDK和Eclipse开发工具,然后创建一个Java Web项目。 代码示例: public class HelloWorld …

    Java 2023年5月19日
    00
  • Java实用工具之StringJoiner详解

    Java实用工具之StringJoiner详解 在Java中,如果需要将多个字符串连接成一个字符串,可以使用String类中的concat方法或加号+运算符进行字符串拼接。但是当我们需要连接的字符串数量较多,或者需要在每个字符串之间添加一定的分隔符时,这两种方法就显得有些麻烦。 针对这种情况,Java提供了一个实用工具类StringJoiner,它可以轻松地…

    Java 2023年5月26日
    00
  • Java之对象销毁和finalize方法的使用

    Java之对象销毁和finalize方法的使用 对象销毁 在Java中,对象销毁是由Java虚拟机自动完成的,程序员不需要关心对象何时被销毁。当一个对象没有任何引用时,Java虚拟机会自动回收这个对象所占的空间。 finalize方法 Java中的finalize方法是由垃圾回收器在回收对象之前调用的方法,它是Object类中的一个方法,子类可以重写这个方法…

    Java 2023年5月26日
    00
  • springboot整合JSR303参数校验与全局异常处理的方法

    下面我将详细讲解“springboot整合JSR303参数校验与全局异常处理的方法”的完整攻略。 一、JSR303参数校验 JSR303,又称Bean Validation,是一个JavaEE标准的框架,可以很方便地对JavaBean的字段进行校验,以保证数据的有效性和安全性。在springboot中,我们可以通过集成hibernate-validator来…

    Java 2023年5月19日
    00
  • 实例解决Java异常之OutOfMemoryError的问题

    实例解决Java异常之OutOfMemoryError的问题 背景 在Java应用程序中经常会遇到异常。其中一个比较常见的异常是OutOfMemoryError,这个问题的出现通常是由于应用程序在运行时申请了过多的内存从而导致内存不足的情况。 解决方案 要解决这个问题,有几个方法可以尝试: 1. 增加JVM内存大小 如果你的应用程序需要更多的内存,可以通过设…

    Java 2023年5月27日
    00
  • hibernate增删改查操作代码

    下面我将详细讲解 Hibernate 的增删改查操作代码的完整攻略。 首先,使用 Hibernate 进行增删改查操作需要遵循以下步骤: 配置 Hibernate 配置文件 hibernate.cfg.xml 创建 Hibernate 工厂对象 SessionFactory 创建 Session 对象 开启事务 执行相应的增删改查操作 提交事务 关闭 Ses…

    Java 2023年5月19日
    00
  • c#桥接模式(bridge结构模式)用法实例

    C#桥接模式(Bridge结构模式)用法实例 什么是C#桥接模式? C#桥接模式,也称为Bridge模式,是一种结构性模式,它将抽象部分与实现部分分离,可以让它们相互独立地变化。这种模式属于结构型模式,它通过提供一个桥接接口,使得抽象和实现可以独立地扩展。 C#桥接模式的应用场景 C#桥接模式主要适用于以下场景: 当一个系统可能有多个角度分类(即多个维度的分…

    Java 2023年5月31日
    00
  • 详解spring boot集成ehcache 2.x 用于hibernate二级缓存

    下面是详解”spring boot集成ehcache 2.x 用于hibernate二级缓存”的完整攻略。 引言 在使用Spring Boot开发项目时,我们往往需要使用到缓存来提高性能。而使用Hibernate框架时,我们可以通过集成Ehcache来实现二级缓存。本文将详细介绍在Spring Boot项目中,如何集成Ehcache 2.x用于Hiberna…

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