当前位置: 首页 > 面试题库 >

如何提供不同的插件采用不同参数的插件模型

文德曜
2023-03-14
问题内容

我正在编写的代码(MyService)包括让每个客户在处理的特定时间点插入自己的计算器的功能。这是为了允许自定义业务规则。至此,计算已经完成,我们知道了很多事情,其中​​有些可能与计算有关。
MyService将为一组特定的输入参数创建并运行一次。

我的计划是使用依赖注入在构造函数中给出MyService一个calculator。这允许不同的用户插入自己的calculator。该calculator会返回一个表示为这个特殊的运行支付的附加费的数额MyService。其他人将实现各种计算器,我需要能够更新我的代码而不会破坏他们的代码。即。保持向后兼容。

我的问题是,各种计算器实现将需要不同的参数。这些参数在MyService创建时不能被构造函数注入到计算器中,因为尚不知道MyService会发生某些处理。

在的特定实例中,只会调用一次计算器MyService。因此,在一种极端情况下,所有参数都可以在构造函数中传递,并且存在一种没有参数的方法可以返回答案。另一方面,所有参数都在方法调用中传递。

AlwaysZeroCalculator可能只是return 0这样,不需要任何参数。
PercentageCalculator需要amount一个百分比。还有一个更复杂的需要amountcustomerNumber。我们可以假设在运行时calculator知道任何可能的需求MyService(或者可以将其本身注入到calculator实现中,例如休眠会话)。

我该如何实施?

以下是一些选项和问题:

  • 使所有计算器实现一个包含所有参数作为方法参数的接口。但是,如果添加了一些额外的东西,那么它们都需要更改,这将不可避免地将其变成第二种选择。
  • 让不同的接口(ICalculatorICalculatorWithAmountICalculatorWithAmountAndCustomerNumber等)。 MyService将需要查看其实现的接口,将calculator其强制转换为该接口,然后调用适当的calculate(..)方法。
  • 引入一个参数对象,其中包括它们所关心的所有内容。这意味着即使最简单也要calculator取决于一切。
  • 使不同的接口和不同的版本MyService期望这些接口之一。
  • 注入calculatorFactory而不是calculator。工厂将采用所有可能的参数,并仅使用正确的参数创建一个计算器。这似乎只是将问题转移到其他地方,而没有解决它。
  • 将一些可怕的哈希图传递给计算器并输入安全性,该死的依赖声明

有没有更好的办法?


问题答案:

这是两个问题:

  • 使用计算器
  • 实例化一个计算器

第一个很简单-所有计算器都做同样的事情,可以有相同的界面。后者是要解决的一个,因为它需要每个计算器实例不同的参数。

从您列出的内容来看,工厂是最佳的解决方案。它并没有将问题转移到其他地方,而是在解决问题。每个工厂都知道其计算器,并且知道需要什么参数。因此,工厂取决于计算器。使用工厂创建计算器只会创建一个对计算器的依赖,而不是其参数或计算器本身的依赖,它可以成为所有工厂实现的工厂界面的一部分。

可以使用任何选择的方式通过属性注入来解决为工厂提供参数的问题-Spring绝对不错。

该应用程序反过来只知道如何使用计算器,因此取决于通用计算器接口,而不取决于任何特定的计算器实现。



 类似资料:
  • 我想执行一个maven版本,在运行于jdk 1.7的Jenkins安装上编译java 1.8代码 我有一个使用JDK参数插件用Java1.8编译的项目。它在进行常规构建时有效。 当我使用maven发布插件进行maven发布时,它会将JVM与java 1.7相结合,而不是插件上指定的版本。我猜它需要环境中的java版本。 如果我将JAVA_HOME for the job设置为1.8,它就会工作。

  • 我不明白gradle插件块 和其他一个: 在第一个块中,我们有一些插件名称。在第二个一个包和版本。我不明白应该在哪里使用第一个块,什么时候使用第二个块。

  • 我在xml文件中使用了约束布局。我有一个类似例子中的视图。Imageview和textview。我希望这两个在点击后有相同的动作。怎么才能把两者组合在一起,给他们一个id? xml:

  • null 目前,我已经为运行应用程序配置了postgres,并通过在和中使用不同的配置了用于测试的h2 对于这些场景,更改数据库连接信息的最简单方法是什么?

  • 问题内容: 我的gradle文件中设置了两种构建类型:debug和release。我希望能够为debug构建类型设置其他应用程序图标。有没有办法通过构建类型来实现此目的而又不涉及产品风味?build.gradle文件在下面。 问题答案: 弄清楚了。您需要做的是创建一个单独的src文件夹debug,其中包含不同的图标。例如,如果您的项目布局如下,并且启动器图标称为ic_launcher.png: 然

  • 我想使用不同的csv配置文件为不同的负载/线程运行相同的JMX文件。假设 csv 文件包含用户名和密码的数据。对于 test1 csv 文件有 1000 行,而 test2 csv 文件有 2000 行,如下所示。 我如何通过命令行为相同的JMX文件提供不同的csv文件以获得不同的线程数。 我知道我可以通过命令行使用像${__P(threads,)}这样的__P()函数来传递threads、ram