假设我有一个 Swing GUI,它必须以两种不同的方式显示某种类型的信息。从设计模式的角度来看,这里可能会使用策略模式:创建一个接口来定义显示组件和客户端之间的通信方式,如下所示:
public interface Foo {
void showData(Data bar)
}
然后,真正的动作由实现 Foo 的不同组件完成,并且可以创建和插入以完成实际工作。
现在,如果真正的组件是 java.awt.Components,会发生什么?正如我所看到的,它会导致类型转换混乱,因为 Component 是一个类。让我们假设一个像这样的实现:
public class Baz extends Component implements Foo {
...
}
如果我想传递 Baz 类的对象,这些方法可以使用“Component”作为参数类型或“Foo”。问题是某些方法需要既是 Component 又是 Foo 的对象(例如,因为它们将对象添加到 JPanel,然后提供调用接口方法的数据showData()
)。
正如我所看到的,我有一些选择可以实现这一点:
- 我可以将引用作为组件传递并转换为 Foo。之前,我必须检查引用是否是 Foo 的实例,并且我必须处理不满足此要求的情况。另一个问题是我必须与组件传递的方法的客户端进行通信,还必须实现 Foo,这很尴尬且容易出错。
- 我可以用 Foo 做同样的事情
- 我可以向 Foo 接口添加一个方法“Component getComponent()”,并且实现将始终返回“this”。这个样板方法可以放入 Component 的抽象子类中。这个解决方案意味着一个我不想要的接口方法和一个我不需要的额外子类。
- 我可以传递两个引用,一个 Component 和一个 Foo 引用到同一个对象。不过,在内部,我必须确保两个引用都属于同一个对象。我必须处理不满足此要求的情况。
- 我可以使用 Component 的抽象子类并使用抽象方法定义接口。这将允许我以类型安全的方式传递引用,但打破了良好的 OOP 实践:保持接口和实现分离以及接口隔离原则。
因此,所有这些解决方案都只是变通方法。有什么我缺少的解决方案吗?我应该怎么办?