我对采用哪种设计模式以获得以下内容有一个很大的疑问:
我有一个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之间存在同步问题,共享这个变量进行读写。
我想到了Observer模式,但它仍然需要每个B,C,D注册A并且它不能解决同步问题。
答案 0 :(得分:1)
如果你想将A与B,C和D的存在分开,那么你需要创建一个Proxy对象作为中间人。此对象将知道如何到达A的实例,并在不可用时进行临时响应。
为了减少同步问题,我建议使用一个消息队列来保存a1
值的连续变化。代理将轮询此队列并相应地更新swing类。实际上,代理可以为此目的实现Observer
模式。在A上工作的线程必须将更新发布到消息队列。通过将其转换为一对一的生产者消费者设置,您可以通过使用适当的排队来最小化延迟,例如ConcurrentLinkedQueue
。
Proxy
甚至不必为队列中的每个值在swing组件上运行更新,而只是在最新的(抛弃所有中间值)上。
更新:SwingWorker课程似乎是一个很好的候选人。