ObservableBase.java 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package cz.davza.studentadventure.base;
  2. import cz.davza.studentadventure.enums.CommandState;
  3. import cz.davza.studentadventure.interfaces.IObservable;
  4. import cz.davza.studentadventure.interfaces.IObserver;
  5. import java.util.HashMap;
  6. import java.util.HashSet;
  7. import java.util.Map;
  8. import java.util.Set;
  9. // DU Z 12. CVIČENÍ - Návrhový vzor Observer, který se zejména využívá pro sledování ukončení hry
  10. /**
  11. * Base implementation of the Observer pattern for game state events.
  12. *
  13. * <p>Maintains a map of {@link CommandState} keys to sets of registered
  14. * {@link IObserver} listeners. Any class that needs to broadcast state-change
  15. * events (e.g. {@link cz.davza.studentadventure.objects.Game},
  16. * {@link cz.davza.studentadventure.objects.GameMap}) can extend this class and
  17. * call {@link #notifyObservers(CommandState)} when the relevant state occurs.</p>
  18. *
  19. * <p>Multiple observers can be registered for the same state. Observers are stored
  20. * in a {@link HashSet}, so duplicate registrations of the same instance are ignored.</p>
  21. *
  22. * @see IObservable
  23. * @see IObserver
  24. */
  25. public class ObservableBase implements IObservable {
  26. private final Map<CommandState, Set<IObserver>> observers = new HashMap<>();
  27. /**
  28. * Registers an observer to be notified when the given state is fired.
  29. *
  30. * <p>If no observer set exists for {@code registeringState} yet, one is
  31. * created automatically. Registering the same observer instance twice for
  32. * the same state has no effect (set semantics).</p>
  33. *
  34. * @param registeringState the event state this observer wants to listen for
  35. * @param newObserver the observer to register
  36. */
  37. @Override
  38. public void addObserver(CommandState registeringState,IObserver newObserver) {
  39. if (!observers.containsKey(registeringState)) observers.put(registeringState, new HashSet<>());
  40. observers.get(registeringState).add(newObserver);
  41. }
  42. /**
  43. * Notifies all observers registered for the given state.
  44. *
  45. * <p>If no observers are registered for {@code notifiedState}, the call is
  46. * silently ignored. Each registered observer's {@link IObserver#update()} method
  47. * is called in an unspecified order.</p>
  48. *
  49. * @param notifiedState the state event that has occurred
  50. */
  51. @Override
  52. public void notifyObservers(CommandState notifiedState) {
  53. if (!observers.containsKey(notifiedState)) return;
  54. for (IObserver observer : observers.get(notifiedState)) {
  55. observer.update();
  56. }
  57. }
  58. }