我想学习所有主要的设计模式。我刚开始学习java中的多线程。这是观察者模式代码,其中有多个观察者& observable正在while循环中运行。我有以下两个问题:观察者模式Java - 使用线程的多个观察者
- 当调用notifyObservers时,即使我的观察者访问可观察值的getter,我也必须将新值传递给它。如果我不这样做,那么观察者得到/打印值为空。我创建了一个setter函数来演示它。
我创建了两个观察者&,显然他们两人的大部分代码是相似的。我不确定如何实现新的观察者或创建观察者列表而不复制我的代码。我创建了一个basicObserver &试图在MyObserver3中继承它,但我不确定我是如何实现它的。
import java.util.Observable; import java.util.Observer; public class ObserverPatternMultipleObserversUsingThreads { public static void main(String[] args) { ObservableValue observableObj = new ObservableValue(10); MyObserver1 observer1 = new MyObserver1(observableObj); MyObserver2 observer2 = new MyObserver2(observableObj); MyObserver3 observer3 = new MyObserver3(observableObj); observableObj.addObserver(observer1); observableObj.addObserver(observer2); observableObj.start(); System.out.println("Calling Listeners"); observer1.printObservablesValue(); observer2.printObservablesValue(); System.out.println("Main thread says: Sleeping for 3 second(s)"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Main thread says: Going to change Observables Value"); observableObj.setValue(20); } } class basicObserver { private ObservableValue obsValObj = null; public basicObserver(ObservableValue obsVal) { this.obsValObj = obsVal; } public void printObservablesValue() { System.out.println("Observer says: [" + obsValObj.getValue() + "]"); } public void update(Observable o, Object arg) { Integer count = (Integer) arg; System.out.println("Observer says: Value changed to: [" + count + "]"); } } class MyObserver3 extends basicObserver implements Observer { public MyObserver3(ObservableValue obsVal) { super(obsVal); } } class MyObserver1 implements Observer { private ObservableValue obsValObj = null; public MyObserver1(ObservableValue obsVal) { this.obsValObj = obsVal; } public void printObservablesValue() { System.out.println("MyObserver1 says: [" + obsValObj.getValue() + "]"); } public void update(Observable o, Object arg) { Integer count = (Integer) arg; System.out.println("MyObserver1 says: Value changed to: [" + count + "]"); } } class MyObserver2 implements Observer { private ObservableValue obsValObj = null; public MyObserver2(ObservableValue obsVal) { this.obsValObj = obsVal; } public void printObservablesValue() { System.out.println("MyObserver2 says: [" + obsValObj.getValue() + "]"); } public void update(Observable o, Object arg) { Integer count = (Integer) arg; System.out.println("MyObserver2 says: Value changed to: [" + count + "]"); } } class ObservableValue extends Observable implements Runnable { private int n = 0; public ObservableValue(int x) { this.n = x; } public int getValue() { return n; } public void setValue(int x) { this.n = x; setChanged(); System.out.println("ObservableValue says: setChanged() has been called"); // notifyObservers(new Integer(this.n)); notifyObservers(); // makes the observers print null System.out.println("ObservableValue says: notifyObservers() has been called"); } public void start() { new Thread(this).start(); } public void run() { int count = -1; int a=0, b=0; while(a==b) { if(count != n) { count = n; System.out.println("ObservableValue says: My count is: [" + count + "]"); count++; System.out.println("ObservableValue says: Now my count is: [" + count + "]"); setChanged(); System.out.println("ObservableValue says: setChanged() has been called"); notifyObservers(new Integer(count)); System.out.println("ObservableValue says: notifyObservers() has been called"); System.out.println("ObservableValue says: Sleeping for 5 second(s)"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
我真的很感激,关于这些概念的最佳实践的指针/咨询/评论。
请帮忙。
[本教程](http://www.java2s.com/Code/Java/Design-Pattern/AsimpledemoofObservableandObserver.htm)可能很有用。 – 2013-03-17 13:30:28
谢谢@SazzadurRahaman。我理解这个概念。我的问题是为什么我的观察者没有得到最新的值,即使我在改变observable的值之后调用setChanged()和notifyObservers()。 – MdT 2013-03-17 22:45:06