私はすべての主要な設計パターンを学ぼうとしています。Javaでマルチスレッドを学び始めたばかりです。これは、複数のオブザーバーがあり、オブザーバブルが while true ループで実行されているオブザーバー パターン コードです。次の2つの問題があります。
- notifyObservers を呼び出すときは、オブザーバーが監視可能な値のゲッターにアクセスしていても、新しい値を渡す必要があります。そうしないと、オブザーバーは値 null を取得/出力します。それを示すためにセッター関数を作成しました。
私は 2 つのオブザーバーを作成しましたが、明らかに両方のコードのほとんどが似ています。新しいオブザーバーを実装する方法や、コードを複製せずにオブザーバーのリストを作成する方法がわかりません。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(); } } } } }
これらの概念のベスト プラクティスに関するポインタ、アドバイス、コメントをいただければ幸いです。
助けてください。