package ru.rsdn.patterns.behavioral.observer.test;

import ru.rsdn.patterns.behavioral.observer.ISubscriber;
import ru.rsdn.patterns.behavioral.observer.Publisher;

/**
 * Пример издателя, использующего слабую связь с подписчиками
 */
public class ConcretePublisher extends Publisher<ISubscriber> {
	private boolean state;

	/**
	 * @return состояние
	 */
	public boolean getState() {
		return state;
	}

	/**
	 * Установить состояние
	 * @param _state состояние
	 */
	public void setState(boolean _state) {
		state = _state;
		notifySubscribers();
	}

	private void notifySubscribers() {
		for (final ISubscriber subscriber : getSubscribers())
			try {
				subscriber.eventHappen();
			} catch (final RuntimeException e) {
				System.err.println("Обнаружен дефектный подписчик: " +
						subscriber);
				unsubscribe(subscriber);
			}
	}

	/**
	 * @return количество подписчиков
	 */
	public int getSubscribersCount() {
		return getSubscribers().size();
	}
}