Java 战略模式

Java 战略模式,java,grails,design-patterns,groovy,Java,Grails,Design Patterns,Groovy,我必须为不同的客户端实现API。每个客户机的实现将不同。因此,我正在考虑在groovy中使用一种策略模式(类似于Java),其中我将有一个接口,并为每个客户机创建一个类(实现一个接口),我希望通过接口使用UI(类的下拉选择)配置要调用的类 interface PricingStrategy { } class CanadaPricingStrategy implements PricingStrategy { Method 1... Method 2... } class

我必须为不同的客户端实现API。每个客户机的实现将不同。因此,我正在考虑在groovy中使用一种策略模式(类似于Java),其中我将有一个接口,并为每个客户机创建一个类(实现一个接口),我希望通过接口使用UI(类的下拉选择)配置要调用的类

interface PricingStrategy {


}



class CanadaPricingStrategy implements PricingStrategy {

  Method 1...
  Method 2...

}

class BrazilPricingStrategy implements PricingStrategy {

  Method 1...
  Method 2...

}
这是最好的方法吗?或者我可以通过使用闭包作为变量来使用可插拔行为方法

这是最好的方法还是我可以使用可插拔行为 使用闭包作为变量的方法

在不了解更多需求的情况下,不可能确定,但一般来说,您描述的基于接口的方法是有意义的。这仍然是可插拔的。您可以为每个实现使用单独的插件,并且可以使用提供不同行为的不同插件构建不同版本的应用程序。您可以使用动态发现机制来加载类路径上的所有
PricingStrategy
实现。您有很多选择,但几乎没有关于您的需求的信息,我认为基于接口的方法是一个坚实的起点

这是最好的方法还是我可以使用可插拔行为 使用闭包作为变量的方法


在不了解更多需求的情况下,不可能确定,但一般来说,您描述的基于接口的方法是有意义的。这仍然是可插拔的。您可以为每个实现使用单独的插件,并且可以使用提供不同行为的不同插件构建不同版本的应用程序。您可以使用动态发现机制来加载类路径上的所有
PricingStrategy
实现。您有很多选择,但几乎没有关于您需求的信息,我想说基于接口的方法是一个坚实的起点。

我将根据下面提到的句子将您的问题陈述分为两部分:

  • 为不同的客户端实现API
  • 而且,每个客户机的实现都会有所不同
  • 根据两点,我建议您使用两种不同的设计模式来实现问题陈述:

  • 适配器设计模式:应始终使用适配器设计模式设计API,因为源接口和客户端接口可能不兼容,并且此设计模式将不兼容的接口转换为客户端需要的另一个接口。 这种情况在API的设计中经常发生,因为双方的技术、参数等多种情况不同

  • 策略设计模式:不同客户的内部逻辑实现不同。所以,你应该借助于战略模式来设计它


  • 并且,将此策略模式称为适配器设计模式。

    我将根据下面提到的句子将您的问题陈述分为两部分:

  • 为不同的客户端实现API
  • 而且,每个客户机的实现都会有所不同
  • 根据两点,我建议您使用两种不同的设计模式来实现问题陈述:

  • 适配器设计模式:应始终使用适配器设计模式设计API,因为源接口和客户端接口可能不兼容,并且此设计模式将不兼容的接口转换为客户端需要的另一个接口。 这种情况在API的设计中经常发生,因为双方的技术、参数等多种情况不同

  • 策略设计模式:不同客户的内部逻辑实现不同。所以,你应该借助于战略模式来设计它


  • 并且,将此策略模式称为适配器设计模式。

    谢谢您的回复。我正在考虑为用户(管理员)提供一个选项,为每个客户机配置策略。它将是一个包含PricingStrategy实现列表的下拉列表。该策略将根据为每个客户机所做的配置(存储在DB中的类名)来使用/调用。但我认为这是一种更面向java的方法。我在使用groovy,所以我想到了一种更好的方法(不使用接口)。“我在使用groovy,所以我想到了一种更好的方法(不使用接口)。”-您可以消除接口并利用groovy动态调度,但我不会这么做。该接口的价值有很多原因,即使使用Groovy也是如此。例如,在Grails中,我们在许多地方使用接口,我们希望应用程序或插件为核心框架贡献行为。这是一种非常常见的方法。谢谢。那么,我将采用这种方法。如果我有任何问题,我会回复你的。另外,在这种情况下,我将无法使用服务(我们在Grails中使用),因为它将是一个实现接口的简单groovy类。谢谢你的回复。我正在考虑为用户(管理员)提供一个选项,为每个客户机配置策略。它将是一个包含PricingStrategy实现列表的下拉列表。该策略将根据为每个客户机所做的配置(存储在DB中的类名)来使用/调用。但我认为这是一种更面向java的方法。我在使用groovy,所以我想到了一种更好的方法(不使用接口)。“我在使用groovy,所以我想到了一种更好的方法(不使用接口)。”-您可以消除接口并利用groovy动态调度,但我不会这么做。该接口的价值有很多原因,即使使用Groovy也是如此。例如,在Grails中,我们在许多地方使用接口,在这些地方,我们希望应用程序或插件能够访问c