我正在尝试学习所有主要的设计模式。我刚刚开始学习java中的多线程。这是观察者模式代码,其中有多个观察者,并且 observable 在 while true 循环中运行。我有以下两个问题:
- 当调用 notifyObservers 时,我必须将新值传递给它,即使我的观察者正在访问可观察值的 getter。如果我不这样做,那么观察者会获取/打印值 null。我创建了一个 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(); } } } } }
对于这些概念的最佳实践,我真的很感激任何指针/建议/评论。
请帮忙。