我可以使用哪种设计模式来创建实现特定接口的对象,或者可用接口中的多个或任意组合?例如说我有以下
interface A {
void foo();
}
interface B {
void bar();
}
interface C {
void car();
}
class Agent {
}
我想能够说给我实现接口A的类Agent的对象吗?
或
我希望能够说给我实现接口B的类Agent的对象吗?
或
我希望能够说给我实现接口C的类Agent的对象吗?
或
我想能够说给我实现接口A,B的类Agent的对象吗?
或
我希望能够说给我实现接口B,C的类Agent的对象吗?
或
我希望能够说给我实现接口A,C的类Agent的对象?
或
我希望能够说给我实现接口A,B,C的类Agent的对象?
或
一般来说,我正在寻找的是创建一个可以从任何接口组合中获得功能的对象。
答案 0 :(得分:3)
Java是一种静态类型语言(有关详细信息,请参阅this问题)。这意味着您描述的变量具有包含一组实现的接口的类型。因此,说某个类的对象改变它实现的接口并没有多大意义。
话虽如此,我怀疑你正试图将interface
用于某些不适合的事情。例如,如果您想要一个类,其对象可以具有在创建对象时确定的各种功能,那么有一些设计模式可能适合您。
如果不了解您的需求,很难提出具体细节,但这里有一个可能的模型:
interface A {
void foo();
}
interface B {
void bar();
}
class Agent {
private Optional<A> delegateA = Optional.empty();
private Optional<B> delegateB = Optional.empty();
public void addA(A delegate) {
delegateA = Optional.of(delegate);
}
public boolean implementsA() {
return delegateA.isPresent();
}
public void foo() {
delegateA.ifPresent(A::foo);
}
}
Agent agent = new Agent();
agent.addA(() -> System.out.println("foo"));
agent.implementsA();
agent.foo();
答案 1 :(得分:1)
我能想到的最佳解决方案是让Agent
实现所有接口,然后根据需要使用所需的接口,例如:
A agentUsingA = new Agent();
然后,您只能调用从A。
实现的方法<强> 然而: 强>
这是使用接口的一种非常糟糕的方式。 java中接口的一个主要思想是充当一种“契约”。例如:
假设您有两个班级:AEncryptor
和BEncryptor
。这两个类都实现了接口EncryptService
,它具有方法.encrypt(String text)
。
所以,假设你有一个名为encryptString(EncryptService service, String textToBeEncrypted)
的方法。此方法采用加密服务并使用它来加密字符串textToBeEncrypted
。所有这些方法都可以调用service.encrypt(textToBeEncrypted);
现在,encryptString()
不关心 service
将如何加密字符串,它只知道当它在其上调用.encrypt(textToBeEncrypted)
时,它将会加密文本。
因此AEncryptor
和BEncryptor
可以对文本进行不同的加密,但由于它们实现了EncryptService
,我们知道它是加密方法将在那里,通过调用它,它将加密文本。
在你的例子中,我们真的不知道我们可以在Agent上调用什么,我们不能保证方法(Say,.encrypt()
)实际上会在那里。