package ru.rsdn.patterns.behavioral.observer;

import java.util.Collection;
import java.util.Collections;

/**
 * Абстрактный издатель
 * @param <T> тип коллекции подписчиков
 */
public abstract class AbstractPublisher<T extends Collection<ISubscriber>> {
	protected final T subscribers;

	/**
	 * Конструктор
	 * @param _subscribers коллекция подписчиков
	 */
	public AbstractPublisher(T _subscribers) {
		if (_subscribers == null)
			throw new NullPointerException("Пустой параметр");
		subscribers = _subscribers;
	}

	/**
	 * Подписаться
	 * @param subscriber подписчик
	 */
	public void subscribe(ISubscriber subscriber) {
		if (subscriber == null)
			throw new NullPointerException("Пустой параметр");
		if (subscribers.contains(subscriber))
			throw new IllegalArgumentException("Повторная подписка: " +
					subscriber);
		subscribers.add(subscriber);
	}

	/**
	 * Отписаться
	 * @param subscriber подписчик
	 */
	public void unsubscribe(ISubscriber subscriber) {
		if (subscriber == null)
			throw new NullPointerException("Пустой параметр");
		if (!subscribers.contains(subscriber))
			throw new IllegalArgumentException("Неизвестный подписчик: " +
					subscriber);
		subscribers.remove(subscriber);
	}

	/**
	 * @return подписчики
	 */
	public Collection<ISubscriber> getSubscribers() {
		return Collections.unmodifiableCollection(subscribers);
	}
}