首先,我想说我认为这是一个常见问题,可能有一个我不知道的简单或常见的解决方案。许多人可能遇到过类似的问题。谢谢你的阅读。
我正在创建一个GUI,其中每个组件需要通过(或至少更新)进行通信 多个其他组件。目前,我正在使用Singleton类来实现这一目标。每个GUI组件都获取单例的实例并注册自己。当需要进行更新时,单例可以调用已注册类中的公共方法。我认为这类似于Observer模式,但是单例具有更多控制权。目前,该程序设置如下:
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,但它仍然非常混乱,因为私有成员变量的数量增加,构造函数的长度增长。
每个类都包含需要通过CommClass进行通信的GUI组件,但我想不出一个好方法。
如果这看起来很奇怪或非常低效,请描述一些类之间的通信方法,这些方法将随着项目的发展而继续工作。此外,如果这对任何人都没有任何意义,我会尝试在将来提供实际的代码片段,并想出一个更好的方式来提问。感谢。
答案 0 :(得分:0)
通过使用Dependency Injection判断您尝试做的事情是否有问题有点困难。使用Inversion of Control原则,如果你有一些定义良好的接口,可以将它们注入对象的构造函数,而不需要明确地执行它。它是使用类似String的框架完成的,它使用容器和反射来执行任务。
对用例有很多假设,如:
我不是Spring的专家,但我使用的IoC具有“限制”。通常IoC用于服务而不是用于GUI元素,因此请尽量使用这个答案。我希望它为您提供一个新的有用的冲动,为您正在寻找的可扩展性提供良好的解决方案。至少IoC在对象之间提供了非常好的解耦。