java - Builder Design Pattern 为具有大量参数的方法创建通用方法

标签 java design-patterns

我有一个接口(interface) Itest 并且 ClassAClassB 正在实现这个接口(interface)。 testA & testB 分别是这些类中的方法。

testA(String a, String b, String c, D d, E e)

testB(String a, String b, String c, F f, G g) 

这里的DEFG是自定义数据类型(与数据库相关)。我简化了方法,实际上它们有更多的参数。

我需要在 Itest 接口(interface)的 testAB 中创建一个通用方法,并在两个类中实现它,而不是拥有它们自己的方法。

testAB(String a, String b, String c, D d, E e, F f, G g)

随着参数的数量越来越多,泛型方法testAB 将让用户感到痛苦,因为他必须传递如此多的null 值。

  • 这是构建器设计模式的用例吗?

  • 如果是,如何使用此设计模式实现?

最佳答案

看起来您的核心要求是您不希望客户端在不需要时传递额外的参数。您可以使用普通的旧方法 重载 解决您的问题:

改变您的 ITest 接口(interface),使其具有一个名为 test 的方法

public interface ITest {
     public void test(String a,String b,String c,D d,E e,F f,G g);
}

改变 A 如下:

public class A implements ITest {

     //this is an overload - v1
     public void test(String a,String b,String c,D d,E e) {
            //dispatch the call to the overriden method
            test(a,b,c,d,e,null,null);
     }

     //this is an overload - v2
     public void test(String a,String b,String c,E e,F f) {
           //dispatch the call to the overriden method
           test(a,b,c,null,null,e,f);
     }

     @Override
     //this is an overriden method - v3
     public void test(String a,String b,String c,D d,E e,F f,G g) {
            if(d!=null && e!=null) {
                //use a,b,c,d,e and do something
            } 

            if(f!=null && g!=null) {
                //use a,b,c,f,g and do something
            }
     }
}

现在客户端代码可以调用他们想要的任何重载表单而无需传递 null。您的重载方法将简单地将调用分派(dispatch)给一个通用方法(这为您提供了代码重用的优势):

classAObj.test("1","2","3",new D(),new E());//calls overloaded method - v1
classAObj.test("1","2","3",new F(),new G());//calls overloaded method - v2
classAObj.test("1","2","3",new D(),new E(),new F(),new G());//calls overriden method - v3

请注意客户端代码如何不必担心在不需要时传递额外的参数。还要注意客户端调用看起来有多干净。也可以在 B 中进行类似的更改。


<子>1。您可以选择将 ITest 设为抽象类。这将允许您使其中的 test 方法具有 protected 访问说明符。需要 protected 访问说明符的原因是限制客户端类能够访问该方法并始终通过重载表单。如果您目前坚持使用 interface,则可以考虑在将来实现此附加功能。

<子>2。您还可以利用 Generics 来避免每次引入新对象类型时都需要编写一个新类,但是正如您从其他答案中看到的那样,这很容易使您的代码复杂化很大程度上。您还可以将重载方法添加到 ITest 接口(interface),使其成为其契约的一部分。但是,我故意将这些部分排除在我的回答之外,因为您的问题的关键可以通过使用重载来解决。

<子>3。 Builder 模式是一种创建型模式。在这种特殊情况下,这是一种矫枉过正,因为 DEFG 等类是域对象。 AB 类在真正意义上并不依赖于它们,而是将它们用作数据源。

关于java - Builder Design Pattern 为具有大量参数的方法创建通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30639947/

相关文章:

java - 压缩和解压缩 .ear 文件时校验和不同

java: LinkedHashMap containsKey=true 但 get 返回 null

java - 如何用java制作一个简单的计时器,单击按钮即可启动/停止计时器?

c++ - 编写 JSON 解释器的设计问题

design-patterns - 编程语言和设计模式

c# - 在 C# 中概括和聚合 XML 转储的最佳方法是什么?

java - 数独与 AC3

java - 收到错误 Invalid Oracle URL specified : OracleDataSource. makeURL

oop - 选择哪种设计模式

java - 如何使用接口(interface)或抽象类隐藏实现类