Observer Pattern: Internal and External Registration

What is the best choice for observer registration? I did not find anything about this. Mostly "push vs. pull" is discussed, but there are also several options for observer registration.

public static void main(String[] args)
{
    Subject subject = new ConcreteSubject();
    // External registration
    Observer observerExternal = new ConcreteObserverExternal();
    subject.registerObserver(observerExternal);
    // Internal registration, option 1
    Observer observerInternal1 = new ConcreteObserverInternal1(subject);
    // Internal registration, option 2
    ConcreteObserverInternal2 observerInternal2 = new ConcreteObserverInternal2(subject);
}

interface Observer
{
    void inform();
}
class ConcreteObserverExternal implements Observer
{
    @Override
    public void inform()
    {
        // do sth.
    }
}
class ConcreteObserverInternal1 implements Observer
{
    public ConcreteObserverInternal1(Subject subject)
    {
        subject.registerObserver(this);
    }

    @Override
    public void inform()
    {
        // do sth.
    }
}
class ConcreteObserverInternal2
{
    public ConcreteObserverInternal2(Subject subject)
    {
        subject.registerObserver(() -> inform());
    }

    private void inform()
    {
        // do sth.
    }
}
interface Subject
{
    void registerObserver(Observer obs);

    void unregisterObserver(Observer obs);
}
class ConcreteSubject implements Subject
{
    @Override
    public void registerObserver(Observer obs)
    {
        // register
    }

    @Override
    public void unregisterObserver(Observer obs)
    {
        // unregister
    }

    private void foo()
    {
        // ...
        notifyObservers();
    }

    private void notifyObservers()
    {
        // notify observers
    }
}

Here are three cases that I have in my code:

  • The observer is registered when the program starts and is never registered. In this case, all three options will be possible.
  • The observer is registered somewhere and must be unregistered when some external event occurs. The observer does not know about this external event and, obviously, must be registered externally (option 1).
  • - , - . , , . .

, 3 , OO ?

, , , .

1.

:
 - .
 - , .

:
 - .
 - .

:
 - .
 - / .

2. , 1: Observer

:
 - .
 - , Subject Observer.

:
 - .

:
 - .
 - / .
 - / .

3. , 2: Observer

:
 - .
 - , Subject Observer.
 - , , "Subject notifying Observer".

:
 - .

:
 - / .

+4
1

, "" "" , , . , .

"" :

  • Observer Subject s; . , Observer Subject s, .
  • . Observer , , inform ed. / -.
+1

Source: https://habr.com/ru/post/1659250/


All Articles