# MaterialObserver.java

    package com.university.bookstore.observer;

    /**
     * Observer interface for material-related events in the Observer pattern.
     * Defines the contract for objects that need to be notified of material events.
     *
     * <p>This interface allows components to subscribe to material events and be
     * automatically notified when events occur, enabling loose coupling between
     * the event source and event handlers.</p>
     *
     * @author Navid Mohaghegh
     * @version 3.0
     * @since 2024-09-15
     */
    public interface MaterialObserver {

        /**
         * Called when a material event occurs.
         *
         * @param event the material event that occurred
         */
        void onEvent(MaterialEvent event);

        /**
         * Gets the name of this observer for identification purposes.
         *
         * @return the observer name
         */
        default String getObserverName() {
            return getClass().getSimpleName();
        }

        /**
         * Called when the observer is added to a subject.
         * Can be used for initialization or setup.
         *
         * @param subject the subject this observer was added to
         */
        default void onAdded(MaterialSubject subject) {
            // Default implementation does nothing
        }

        /**
         * Called when the observer is removed from a subject.
         * Can be used for cleanup.
         *
         * @param subject the subject this observer was removed from
         */
        default void onRemoved(MaterialSubject subject) {
            // Default implementation does nothing
        }
    }