package cn.bunny.pattern3.demo2;

import java.util.ArrayList;
import java.util.List;

public class ObserverDemo {
    public static void main(String[] args) {
        // 定义的主题
        News news = new News();

        // 观察者
        SisterObserver sisterObserver = new SisterObserver();
        GirlfriendObserver girlfriendObserver = new GirlfriendObserver();

        // 添加观察者
        news.addObserver(sisterObserver);
        news.notifyObservers("添加了妹妹");

        System.out.println("\n-----------------分割线-----------------\n");

        // 添加女朋友
        news.addObserver(girlfriendObserver);
        news.notifyObservers("添加了女朋友");

        System.out.println("\n-----------------分割线-----------------\n");
        news.removeObserver(girlfriendObserver);
        news.notifyObservers("需要和妹妹说点悄悄话，将女朋友移除了，这时女朋友听不见我们说话。。。");
    }

    // 观察者接口
    @FunctionalInterface
    interface Observer {
        void update(String message);
    }

    // 主题接口
    interface Subject {
        void addObserver(Observer observer);

        void removeObserver(Observer observer);

        void notifyObservers(String message);
    }

    // 妹妹观察者
    static class SisterObserver implements Observer {
        @Override
        public void update(String message) {
            System.out.println("SisterObserver 接受到消息：" + message);
        }
    }

    // 女朋友观察者
    static class GirlfriendObserver implements Observer {
        @Override
        public void update(String message) {
            System.out.println("GirlfriendObserver 接受到消息：" + message);
        }
    }

    // 主题类
    static class News implements Subject {

        private final List<Observer> observerList = new ArrayList<>();

        @Override
        public void addObserver(Observer observer) {
            observerList.add(observer);
        }

        @Override
        public void removeObserver(Observer observer) {
            observerList.remove(observer);
        }

        @Override
        public void notifyObservers(String message) {
            for (Observer observer : observerList) {
                observer.update(message);
            }
        }
    }
}

