gpt4 book ai didi

java - 将所有 GUI 组件注册为观察者或将当前对象作为构造函数参数传递给下一个对象?

转载 作者:行者123 更新时间:2023-12-02 15:19:41 25 4
gpt4 key购买 nike

首先,我想说,我认为这是一个常见问题,可能有一个我不知道的简单或常见的解决方案。很多人可能都遇到过类似的问题。感谢您的阅读。

我正在创建一个 GUI,其中每个组件都需要通过以下方式进行通信(或至少更新)多个其他组件。目前,我正在使用 Singleton 类来实现此目标。每个 GUI 组件都会获取单例的实例并注册自身。当需要进行更新时,单例可以调用注册类中的公共(public)方法。我认为这类似于观察者模式,但单例有更多的控制权。目前,该程序的设置如下:

class c1 {
CommClass cc;
c1() {
cc = CommClass.getCommClass();
cc.registerC1( this );
C2 c2 = new c2();
}
}

class c2 {
CommClass cc;
c2() {
cc = CommClass.getCommClass();
cc.registerC2( this );
C3 c3 = new c3();
}
}

class c3 {
CommClass cc;
c3() {
cc = CommClass.getCommClass();
cc.registerC3( this );
C4 c4 = new c4();
}
}

等等

不幸的是,随着组件之间需要更多的通信,单例类不断变大。

我想知道不使用这个单例,而是将高阶 GUI 组件作为参数传递到每个 GUI 组件的构造函数中是否是一个好主意:

class c1 {
c1() {
C2 c2 = new c2( this );
}
}

class c2 {
C1 c1;
c2( C1 c1 ) {
this.c1 = c1
C3 c3 = new c3( c1, this );
}
}

class c3 {
C1 c1;
C2 c2;
c3( C1 c1, C2 c2 ) {
this.c1 = c1;
this.c2 = c2;
C4 c4 = new c4( c1, c2, this );
}
}

等等

第二个版本对 CommClass 的依赖较少,但随着私有(private)成员变量数量的增加和构造函数的长度增加,它仍然很困惑。

每个类都包含需要通过 CommClass 进行通信的 GUI 组件,但我想不出一个好的方法来做到这一点。

如果这看起来很奇怪或效率极低,请描述一些类之间的通信方法,这些方法将随着项目的发展而继续发挥作用。另外,如果这对任何人都没有任何意义,我会尝试在将来提供实际的代码片段,并想出更好的方法来提出问题。谢谢。

最佳答案

很难判断您正在尝试做的事情是否可以通过使用 Dependency Injection 来解决。使用Inversion of Control原则上,如果您有一些定义良好的接口(interface),则可以将它们注入(inject)到对象的构造函数中,而无需显式执行。它是使用像 String 这样的框架来完成的。 ,它利用容器和反射来执行任务。

关于用例有很多假设,例如:

  • 您可以使用接口(interface)来区分哪些对象在其他对象上注册
  • 不确定这一点:给定接口(interface)只能将一个对象添加到容器中

我不是 Spring 专家,但我使用的 IoC 有“限制”。通常 IoC 用于服务而不是 GUI 元素,因此对这个答案持保留态度。我希望它能给您带来新的有用的插入力,为您所寻求的可扩展性找到一个好的解决方案。至少IoC在对象之间提供了非常好的解耦。

关于java - 将所有 GUI 组件注册为观察者或将当前对象作为构造函数参数传递给下一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2467779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com