簡體   English   中英

Observer 的構造函數是否需要 Observable 作為參數?

[英]does the Constructor of an Observer needs the Observable as parameter?

我正在嘗試為我的動漫 GUI 實現一個觀察者。

因此,如果發布了動漫劇集,則通知其他觀察者更新該特定動漫劇集的狀態。

它有效。

我的問題:

我正在嘗試了解觀察者模式,我想知道是否必須將 Observable 作為參數提供給觀察者的構造函數。

因為我在一些教程和網站上看到過,所以我有點困惑。

此致

你的喬治

它不一定需要在創建時了解 observable。

你可以這樣實現(簡單的例子,當然不完美)

class MyObservable {

    private ArrayList<MyObserver> observersList = new ArrayList<>();

    public void addObserver(MyObserver observer) {
        observersList.add(observer)
        // OR observer.addObservable(this) , but it is kinda strange one
    }

    public void onAnimeReleased() {
        // Some other logic, release Anime and etc...
        notify();
    } 

    private void notify() {
        observersList.forEach((obs) -> obs.notify());
    }
}

請注意,您還可以持有對不在集合中的觀察者的引用。

private MyObserver animeObserver;

總而言之,通常實現這種模式意味着您需要實現一種將觀察者添加到 observable 並在需要時通知它們的方法。

不必要。 您通常這樣做是為了將 oberver 注冊到 observable。 但是您也可以從外部執行此操作。 使用構造函數方法的優點是你不會錯過在編碼時注冊觀察者,否則兩種方法都很好。

使用構造函數:

  public MyObserver(MyObservable myObservable) {
      myObservable.register(this);
  }

  Main code: 
  MyObservable observable1 = new MyObservable();

        Observer obj1 = new MyObserver(observable1 );
        Observer obj2 = new MyObserver(observable1 );
        Observer obj3 = new MyObserver(observable1 );

像這樣沒有構造函數:

        Observer obj1 = new MyObserver();
        Observer obj2 = new MyObserver();
        Observer obj3 = new MyObserver();

        //register observers to the subject
        observable1.register(obj1);
        observable1.register(obj2);
        observable1.register(obj3);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM