我正在尝试学习所有主要的设计模式。我刚开始学习Java中的多线程。这是一个观察者模式代码,其中有多个观察者,可观察对象在while true循环中运行。我遇到了以下两个问题:
- When calling notifyObservers, I have to pass the new value to it even though my observers are accessing the getter of the observable value. If I don't, then the observer gets/prints value null. I have created a setter function to demonstrate it.
I created two observers & obviously most of the code for both of them is similar. I'm not sure how to implement new observers or create a list of observers without replicating my code. I created a basicObserver & tried to inherit it in MyObserver3, but I am not sure how exactly do I implement it.
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(); } } } } }
关于这些概念的最佳实践方面,我真的很感谢您提供任何指导/建议/评论。
请帮忙。