我有一个接口(interface) Itest
并且 ClassA
和 ClassB
正在实现这个接口(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)
这里的D
、E
、F
、G
是自定义数据类型(与数据库相关)。我简化了方法,实际上它们有更多的参数。
我需要在 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
模式是一种创建型模式。在这种特殊情况下,这是一种矫枉过正,因为 D
、E
、F
和 G
等类是域对象。 A
和 B
类在真正意义上并不依赖于它们,而是将它们用作数据源。
关于java - Builder Design Pattern 为具有大量参数的方法创建通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30639947/