23种设计模式,组合模式的概念优缺点以及JAVA代码举例

简介: 【4月更文挑战第5天】组合模式(Composite Pattern)是一种结构型设计模式,旨在通过将对象组合成树形结构以表示部分-整体的层次结构,使用户对单个对象和组合对象的使用具有一致性。这种模式让客户可以统一地处理单个对象和组合对象

组合模式(Composite Pattern)是一种结构型设计模式,旨在通过将对象组合成树形结构以表示部分-整体的层次结构,使用户对单个对象和组合对象的使用具有一致性。这种模式让客户可以统一地处理单个对象和组合对象。

概念

组合模式主要分为三个角色:

  • 组件(Component):是组合中对象声明接口,在适当情况下,实现所有类共有接口的默认行为。用于访问和管理子部件。
  • 叶子(Leaf):在组合中表示叶节点对象,叶子节点没有子节点。
  • 组合(Composite):定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关的操作。

优点

  1. 高层模块调用简单:客户端可以一致的使用组合结构和单个对象。
  2. 节点自由增加:更容易在组合体内加入对象部件,客户端不会因为加入了新的对象部件而更加复杂。

缺点

  1. 设计变得更加抽象:设计更加抽象,使得组合的设计变得更加复杂,客户端需要花更多时间理解以便正确地使用。
  2. 不容易限制组件的类型:很难限制组合中的组件。

Java代码示例

考虑一个简单的文件系统,包含文件和文件夹,文件夹中可以包含文件或其他文件夹。

首先,定义Component接口:

java复制代码

public abstract class Component {
    protected String name;

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

    public abstract void add(Component c);
    public abstract void remove(Component c);
    public abstract void display(int depth);
}

实现Leaf,在这里是File类:

java复制代码

public class File extends Component {
    public File(String name) {
        super(name);
    }

    public void add(Component c) {
        System.out.println("Cannot add to a file");
    }

    public void remove(Component c) {
        System.out.println("Cannot remove from a file");
    }

    public void display(int depth) {
        System.out.println(new String("-".repeat(depth)) + name);
    }
}

实现Composite,在这里是Directory类:

java复制代码

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

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

    public Directory(String name) {
        super(name);
    }

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

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

    public void display(int depth) {
        System.out.println(new String("-".repeat(depth)) + name);
        for (Component component : children) {
            component.display(depth + 2);
        }
    }
}

使用示例:

java复制代码

public class CompositePatternDemo {
    public static void main(String[] args) {
        Component rootDirectory = new Directory("root");
        Component file1 = new File("File1");
        Component file2 = new File("File2");
        Component subDirectory = new Directory("subdir");

        rootDirectory.add(file1);
        rootDirectory.add(subDirectory);
        subDirectory.add(file2);

        rootDirectory.display(1);
    }
}

在这个例子中,Composite模式允许客户端统一地处理文件和文件夹,客户端无需关心当前操作的是单个文件还是一整个文件夹,大大简化了代码的复杂度。

相关文章
|
5月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
1080 35
|
5月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
469 8
|
5月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
756 157
|
5月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
615 2
|
5月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
454 6
|
5月前
|
Java 数据处理 API
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
318 115
|
5月前
|
安全 Java 编译器
为什么你的Java代码需要泛型?类型安全的艺术
为什么你的Java代码需要泛型?类型安全的艺术
231 98
|
5月前
|
Java 编译器 API
java最新版和java8的区别,用代码展示
java最新版和java8的区别,用代码展示
461 43
|
5月前
|
安全 Java 容器
告别空指针噩梦:Optional让Java代码更优雅
告别空指针噩梦:Optional让Java代码更优雅
465 94
|
5月前
|
安全 Java 容器
告别繁琐判空:Optional让你的Java代码更优雅
告别繁琐判空:Optional让你的Java代码更优雅