1

我对采用哪种设计模式来获得以下内容有一个很大的疑问:

我有一个不能是静态的 A 类,它有一个更新变量 a1 的正在运行的线程;

多个摇摆类别(B、C、D)必须用变量 A.a1 的当前值更新 JLabel b1、c1、d1。

因为 A 不能是静态的 B、C、D 不能像 b1.setText(A.getInstance().getA1());

同样每次创建 A 的新实例也没有意义,因为 A 具有特定的角色并且不能每次都创建。

因为 A 有一个更新 a1 变量的线程,所以我认为 A、B、C、D 之间共享此变量以进行读写也存在同步问题。

我想到了观察者模式,但它仍然要求每个 B、C、D 都向 A 注册,它并没有解决同步问题。

4

1 回答 1

1

如果你想将 A 与 B、C 和 D 的存在解耦,那么你需要创建一个代理对象来充当中间人。该对象将知道如何到达 A 的实例,并在它不可用时做出临时响应。

为了减少同步问题,我建议使用一个消息队列来保存a1值的连续更改。代理将轮询此队列并相应地更新 swing 类。事实上,代理可以Observer为此目的实现该模式。在 A 上工作的线程必须将更新发布到消息队列。通过将其转换为一对一的生产者消费者设置,您可以通过使用适当的队列(如ConcurrentLinkedQueue.

Proxy甚至不必为队列中的每个值运行摆动组件的更新,而只需更新最新的(丢弃所有中间值)。

更新:SwingWorker类似乎是一个很好的候选者。

于 2013-03-08T15:31:55.913 回答