首页 > Java > java教程 > 正文

动态参数类型处理:使用 Builder 模式构建灵活的函数

霞舞
发布: 2025-08-19 16:34:01
原创
999人浏览过

动态参数类型处理:使用 builder 模式构建灵活的函数

本文介绍了如何使用 Builder 模式来解决函数参数类型不确定的问题。Builder 模式允许我们在构建对象时,逐步设置对象的属性,从而避免了创建大量重载方法或使用复杂的条件判断。

Builder 模式详解

Builder 模式是一种创建型设计模式,它将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。Builder 模式通常包含以下几个角色:

  • Builder(抽象建造者): 定义了构建对象的抽象方法,通常包含设置对象各个属性的方法。
  • ConcreteBuilder(具体建造者): 实现了 Builder 接口,负责具体对象的构建过程。
  • Director(指挥者): 负责安排构建过程,调用 Builder 的方法来构建对象。
  • Product(产品): 表示被构建的复杂对象。

示例代码:使用 Builder 模式构建 Range 函数

以下代码示例展示了如何使用 Builder 模式来构建一个 Range 函数,该函数接受 scale、min 和 max 三个参数,每个参数既可以是 double 类型的数值,也可以是接受 PVector 类型参数并返回 Double 类型的函数。

import processing.core.PVector;

import java.io.IOException;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;

import static processing.core.PApplet.map;
import static processing.core.PApplet.noise;

public class RangeBuilderExample {

    public static void main(String... args) throws IOException {
        List<PVector> pvs = List.of(new PVector(0, 0));

        Stream<Double> s = pvs.stream().map(new RangeBuilder().scale(.02)
                                                              .min(0)
                                                              .max(255)
                                                              .build());
        Stream<Double> s2 = pvs.stream().map(new RangeBuilder().scale(new RangeBuilder().scale(.02)
                                                                                        .min(.1)
                                                                                        .max(.002)
                                                                                        .build())
                                                           .min(0)
                                                           .max(255)
                                                           .build());

    }

    public static final class RangeBuilder {

        private Function<PVector, Double> scale;
        private Function<PVector, Double> min;
        private Function<PVector, Double> max;

        public RangeBuilder scale(Function<PVector, Double> scale) {
            this.scale = scale;
            return this;
        }

        public RangeBuilder scale(double scale) {
            return scale(in -> scale);
        }

        public RangeBuilder min(Function<PVector, Double> min) {
            this.min = min;
            return this;
        }

        public RangeBuilder min(double min) {
            return min(in -> min);
        }

        public RangeBuilder max(Function<PVector, Double> max) {
            this.max = max;
            return this;
        }

        public RangeBuilder max(double scale) {
            return scale(in -> scale);
        }

        public Function<PVector, Double> build() {
            return pv -> map(noise(pv.x * scale.apply(pv), pv.y * scale.apply(pv)), 0, 1, min.apply(pv), max.apply(pv));
        }

    }
}
登录后复制

代码解释:

  1. RangeBuilder 类: 这是具体的 Builder 类,它包含了 scale、min 和 max 三个 Function<PVector, Double> 类型的属性,用于存储构建 Range 函数所需的参数。
  2. scale(Function<PVector, Double> scale)、min(Function<PVector, Double> min)、max(Function<PVector, Double> max) 方法: 这些方法用于设置 scale、min 和 max 属性的值,它们接受 Function<PVector, Double> 类型的参数。
  3. scale(double scale)、min(double min)、max(double scale) 方法: 这些方法是重载方法,用于设置 scale、min 和 max 属性的值,它们接受 double 类型的参数。在这些方法内部,我们将 double 类型的参数转换为 Function<PVector, Double> 类型,并调用对应的 scale(Function<PVector, Double> scale)、min(Function<PVector, Double> min)、max(Function<PVector, Double> max) 方法。
  4. build() 方法: 该方法负责构建 Range 函数,它将 scale、min 和 max 属性的值传递给 map 函数,并返回一个 Function<PVector, Double> 类型的函数。

使用示例:

即构数智人
即构数智人

即构数智人是由即构科技推出的AI虚拟数字人视频创作平台,支持数字人形象定制、短视频创作、数字人直播等。

即构数智人 36
查看详情 即构数智人

在 main 方法中,我们首先创建了一个 List<PVector> 类型的列表 pvs,其中包含一个 PVector 对象。然后,我们使用 RangeBuilder 类来构建两个 Range 函数 s 和 s2。

  • s 函数的 scale 参数设置为 0.02,min 参数设置为 0,max 参数设置为 255。
  • s2 函数的 scale 参数设置为另一个 Range 函数,该函数的 scale 参数设置为 0.02,min 参数设置为 0.1,max 参数设置为 0.002,min 参数设置为 0,max 参数设置为 255。

最后,我们使用 pvs.stream().map() 方法将 s 和 s2 函数应用于 pvs 列表中的每个 PVector 对象,并将结果存储在 Stream<Double> 类型的流中。

注意事项

  • 在 Builder 模式中,Builder 类通常被定义为静态内部类,以便更好地封装构建过程。
  • Builder 模式可以与其他设计模式结合使用,例如,可以将 Builder 模式与工厂模式结合使用,以创建更复杂的对象。
  • 在示例代码中,我们使用了 double 类型来代替 float 类型,这是因为 double 是浮点数的默认类型。

总结

Builder 模式是一种非常有用的设计模式,它可以帮助我们构建复杂的对象,并提高代码的可读性和可维护性。在函数参数类型不确定的场景中,使用 Builder 模式可以避免创建大量重载方法或使用复杂的条件判断,从而使代码更加简洁易懂。 通过使用 Builder 模式,我们可以更加灵活地处理动态参数类型,并构建出更加强大的函数。

以上就是动态参数类型处理:使用 Builder 模式构建灵活的函数的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号