使用实现一对接口的成对类

时间:2016-04-20 16:57:06

标签: java design-patterns

我有两个类FooBar,以及一个使用这两个类的Algorithm类。

class Foo {
    void method(Bar bar) {
        bar.otherMethod();
        ...
    }
}

class Bar {
    void method() {
        ...
    }

    void otherMethod() {
        ...
    }
}

class Algorithm {
    void run(Foo foo, Bar bar) {
        foo.method(bar);
        bar.method();
        ...
    }
}

算法部分(run方法)是通用的,我希望能够在其他项目中重用它,包括类似于FooBar的其他类对,我知道每个人都有名为method的方法。但是,我不想将Bar.otherMethod置于接口级别(因为它不是其他IFooIBar对所需的通用功能。)

出于这个原因,我定义了两个接口:

interface IFoo {
    void method(IBar bar);
}

interface IBar {
    void method();
}

并更改了Algorithm.run()的签名以便将这些接口用于

void run(IFoo foo, IBar bar).

问题在于,现在,在Foo类中,我必须进行强制转换才能使用其关联的Bar类中的特定方面。当我使用另一对类时,可能必须进行类似的演员(例如,我可能有Foo2Bar2,其中Foo2.method我需要演员{{1}参数IBar,以便能够使用特定功能。)

Bar2

一般情况下,此演员表是糟糕设计的指标。确实存在问题吗?对于我打算使用通用class Foo implements IFoo { void method(IBar bar) { (Bar)bar.otherMethod(); ... } } 方法,有什么更好的方法?

编辑: 一个相关方面是实践中的Algorithm.run()Foo实现实际上将成对出现。在某些时候,我可能会有其他类BarFoo2,其中Bar2不需要调用Foo2.method。在这种情况下,初始Bar2.otherMethod将与Foo不兼容,但我对此类用例不感兴趣 - 是否可以通过不同的设计进行标记?

Edit2:更改了标题和文字,以便更好地表达我有兴趣一次使用一对Bar2Foo课程。

4 个答案:

答案 0 :(得分:1)

.submit();Foo需要不同的类型吗?听起来每个BarFoo都是紧密耦合的。也许他们应该合并。

答案 1 :(得分:1)

您可能希望利用泛型。也许你有:

interface Bar {
  void frob();
}

interface Foo<T extends Bar> {
  void frood(T bar);
}

然后当你写:

Foo<SomeBar> foo = // ...
SomeBar bar = // ...
foo.frood(bar);

Foo实现知道它有,而不仅仅是Bar,但具体是SomeBar

答案 2 :(得分:0)

是的,将IBar转换为Bar是矛盾的:您使用接口但希望依赖于所有IBar实现将属于Bar类型或其子类型的事实,你无法保证。

在你的场景中,在otherMethod界面中声明IBar是一个较小的邪恶。

答案 3 :(得分:-1)

  

一般情况下,此演员表是糟糕设计的指标......

不是真的,接口是一个非常好的方法来分割一个类做什么以及类如何做更多

  • 他们非常适合定义mixins
  • 他们允许构建非分层类型框架
  • 它们通过包装类实现安全,强大的功能增强

阅读this了解更多详情,或者查看此帖https://stackoverflow.com/a/384067/982161