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

时间:2010-03-18 05:55:22

标签: java design-patterns

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

我正在创建一个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组件,但我想不出一个好方法。

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

1 个答案:

答案 0 :(得分:0)

通过使用Dependency Injection判断您尝试做的事情是否有问题有点困难。使用Inversion of Control原则,如果你有一些定义良好的接口,可以将它们注入对象的构造函数,而不需要明确地执行它。它是使用类似String的框架完成的,它使用容器和反射来执行任务。

对用例有很多假设,如:

  • 您可以使用界面来区分哪些对象在其他对象上注册
  • 对此不确定:只能将给定界面的一个对象添加到容器

我不是Spring的专家,但我使用的IoC具有“限制”。通常IoC用于服务而不是用于GUI元素,因此请尽量使用这个答案。我希望它为您提供一个新的有用的冲动,为您正在寻找的可扩展性提供良好的解决方案。至少IoC在对象之间提供了非常好的解耦。