一起来学设计模式之组合模式

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 前言目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~本节给大家讲一下设计模式中的组合模式,并结合实际业务场景给大家讲解如何使用~本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~组合模式组合模式是一种结构型设计模式,它允许你将对象组合成树状结构,并且能像使用单个对象一样使用组合对象和单个对象。

前言

目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~

本节给大家讲一下设计模式中的组合模式,并结合实际业务场景给大家讲解如何使用~

本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~

组合模式

组合模式是一种结构型设计模式,它允许你将对象组合成树状结构,并且能像使用单个对象一样使用组合对象和单个对象。

组合模式中,有两种类型的对象:单个对象(Leaf)组合对象(Composite)。组合对象可以包含其他组合对象或单个对象,从而形成树状结构。组合对象中通常会定义添加、删除、获取子对象等操作,而单个对象没有这些操作。

举一个例子:需要展示某个组织机构的层级结构,如公司的部门、子部门和员工等等。在这种情况下,组织机构可以被视为一个组合对象,而部门、子部门和员工可以被视为单个对象。

下面是一个简单的 Java 代码示例,展示了如何使用组合模式来表示组织机构的层级结构:

  • 抽象组件
interface Component {
    void show();
}

 

  • 叶子节点

java

复制代码

class Leaf implements Component {
    private String name;
    public Leaf(String name) {
        this.name = name;
    }
    public void show() {
        System.out.println(name);
    }
}
  • 组合节点
class Composite implements Component {
    private String name;
    private List<Component> children = new ArrayList<>();
    public Composite(String name) {
        this.name = name;
    }
    public void add(Component component) {
        children.add(component);
    }
    public void remove(Component component) {
        children.remove(component);
    }
    public void show() {
        System.out.println(name);
        for (Component component : children) {
            component.show();
        }
    }
}

怎么使用呢?

public class CompositeTest {
    public static void main(String[] args) throws Exception {
        // 构建组织机构的层级结构
        Composite root = new Composite("公司");
        Composite department1 = new Composite("部门1");
        Composite department2 = new Composite("部门2");
        Composite subDepartment1 = new Composite("子部门1");
        Leaf employee1 = new Leaf("员工1");
        Leaf employee2 = new Leaf("员工2");
        Leaf employee3 = new Leaf("员工3");
        root.add(department1);
        root.add(department2);
        department1.add(subDepartment1);
        subDepartment1.add(employee1);
        subDepartment1.add(employee2);
        department2.add(employee3);
        // 展示组织机构的层级结构
        root.show();
    }
}

输出:

公司
部门1
子部门1
员工1
员工2
部门2
员工3

在上面的示例中,我们创建了抽象组件 Component 接口来定义组合对象和单个对象的通用方法。叶子节点 Leaf 表示单个对象,而组合节点 Composite 表示组合对象。我们将组合节点中的子节点存储在一个 List 中,从而实现了层级结构。在 Composite 中,我们实现了添加、删除和展示子节点的操作,而在 Leaf 中,我们只实现了展示自身的操作

最佳实践

假设在电商平台上有一些商品,这些商品可以被分为两类:单品和组合商品。单品是指仅由一个商品组成的商品,而组合商品是指由多个商品组合而成的商品。这里使用组合模式来实现这种商品的分类。

首先定义一个商品接口,包含获取商品名称、获取商品价格等方法:

public interface Product {
    String getName();
    double getPrice();
}

然后定义一个单品类,实现商品接口:

public class SingleProduct implements Product {
    private String name;
    private double price;
    public SingleProduct(String name, double price) {
        this.name = name;
        this.price = price;
    }
    @Override
    public String getName() {
        return name;
    }
    @Override
    public double getPrice() {
        return price;
    }
}

接下来定义一个组合商品类,它包含多个子商品,实现商品接口:

public class CompositeProduct implements Product {
    private String name;
    private List<Product> products = new ArrayList<>();
    public CompositeProduct(String name) {
        this.name = name;
    }
    public void addProduct(Product product) {
        products.add(product);
    }
    public void removeProduct(Product product) {
        products.remove(product);
    }
    @Override
    public String getName() {
        return name;
    }
    @Override
    public double getPrice() {
        double totalPrice = 0;
        for (Product product : products) {
            totalPrice += product.getPrice();
        }
        return totalPrice;
    }
}

使用:

public class CompositeTest {
    public static void main(String[] args) throws Exception {
        CompositeProduct root = new CompositeProduct("欧莱雅套装");
        Product product1 = new SingleProduct("欧莱雅洗面奶", 188.00);
        Product product2 = new SingleProduct("欧莱雅洗面霜", 288.00);
        Product product3 = new SingleProduct("欧莱雅爽肤水", 168.00);
        root.addProduct(product1);
        root.addProduct(product2);
        root.addProduct(product3);
        System.out.println(root.getName());
        System.out.println(root.getPrice());
    }
}

输出:

欧莱雅套装
644.0

通过组合模式,可以方便地创建和管理多个商品的组合,而不需要考虑它们是单品还是组合商品,简化了代码的实现和维护。

结束语

设计模式其实并不难,大家在学习的时候一定要在理解的基础上去写代码,不要去背代码。下节给大家讲装饰器模式~

本着把自己知道的都告诉大家,如果本文对您有所帮助,点赞+关注鼓励一下呗~

相关文章

项目源码(源码已更新 欢迎star⭐️)

Kafka 专题学习

项目源码(源码已更新 欢迎star⭐️)

ElasticSearch 专题学习

项目源码(源码已更新 欢迎star⭐️)

往期并发编程内容推荐

推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)

博客(阅读体验较佳)











相关文章
|
4月前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 组合模式
js设计模式【详解】—— 组合模式
52 7
|
2月前
|
设计模式 Java
Java设计模式:组合模式的介绍及代码演示
组合模式是一种结构型设计模式,用于将多个对象组织成树形结构,并统一处理所有对象。例如,统计公司总人数时,可先统计各部门人数再求和。该模式包括一个通用接口、表示节点的类及其实现类。通过树形结构和节点的通用方法,组合模式使程序更易扩展和维护。
Java设计模式:组合模式的介绍及代码演示
|
2月前
|
设计模式 存储 安全
Java设计模式-组合模式(13)
Java设计模式-组合模式(13)
|
5月前
|
设计模式 存储 安全
Java设计模式:组合模式之透明与安全的两种实现(七)
Java设计模式:组合模式之透明与安全的两种实现(七)
|
5月前
|
设计模式 Java
Java设计模式之组合模式详解
Java设计模式之组合模式详解
|
5月前
|
设计模式
组合模式-大话设计模式
组合模式-大话设计模式
|
6月前
|
设计模式 Java 容器
【设计模式系列笔记】组合模式
组合模式(Composite Pattern)是一种结构型设计模式,它允许将对象组合成树状结构以表示部分-整体的层次结构。组合模式使得客户端可以统一处理单个对象和对象组合,而无需区分它们的类型。
85 12
|
6月前
|
设计模式 Go
[设计模式 Go实现] 结构型~组合模式
[设计模式 Go实现] 结构型~组合模式
|
6月前
|
设计模式 安全 Java
[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式
[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式
|
6月前
|
设计模式 Java
【设计模式】文件目录管理是组合模式吗?
【设计模式】文件目录管理是组合模式吗?
41 0

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    54
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    62
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    57
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    41
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    106
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78