我可以使用什么设计模式来创建实现特定接口的对象,或者可用接口中的多个或任意组合?

时间:2016-11-10 05:58:44

标签: java design-patterns

我可以使用哪种设计模式来创建实现特定接口的对象,或者可用接口中的多个或任意组合?例如说我有以下

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的对象?

一般来说,我正在寻找的是创建一个可以从任何接口组合中获得功能的对象。

2 个答案:

答案 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中接口的一个主要思想是充当一种“契约”。例如:

假设您有两个班级:AEncryptorBEncryptor。这两个类都实现了接口EncryptService,它具有方法.encrypt(String text)

所以,假设你有一个名为encryptString(EncryptService service, String textToBeEncrypted)的方法。此方法采用加密服务并使用它来加密字符串textToBeEncrypted。所有这些方法都可以调用service.encrypt(textToBeEncrypted);

现在,encryptString()不关心 service将如何加密字符串,它只知道当它在其上调用.encrypt(textToBeEncrypted)时,它将会加密文本。

因此AEncryptorBEncryptor可以对文本进行不同的加密,但由于它们实现了EncryptService,我们知道它是加密方法将在那里,通过调用它,它将加密文本。

在你的例子中,我们真的不知道我们可以在Agent上调用什么,我们不能保证方法(Say,.encrypt())实际上会在那里。

有关接口的更多信息,请查看Oracle教程herehere。 ;)