Skip to the content.
package com.bookshop.behavioral.observer;

import com.bookshop.domain.Book;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * The subject: knows only that listeners exist, never what they do. Email, SMS,
 * dashboards -- all the same to the inventory.
 */
public class Inventory {

    private final List<StockListener> listeners = new CopyOnWriteArrayList<>();

    public void subscribe(StockListener listener) {
        listeners.add(listener);
    }

    public void unsubscribe(StockListener listener) {
        listeners.remove(listener);
    }

    public void restock(Book book) {
        for (StockListener listener : listeners) {
            listener.onBackInStock(book);
        }
    }
}

Raw file