观察者模式

观察者模式

对象间存在一对多关系时,使用观察者模式.
当一个对象被修改时,会自动通知依赖它的对象,观察者模式属于行为模式

如何解决

抽象类里有一个ArrayList存放观察者们
观察者和被观察者是抽象耦合的,

代码样例

1.抽象Listener接口

interface Listener<T> {
        void onMessage(T t);
}

EmailListener实现类

class EmailListener<String> implements Listener<String> {

        @Override
        public void onMessage(String msg) {
            System.out.println("EmailListener onMessage" + msg);
        }
}

TimlineListener实现类

class TimLineListener<String> implements Listener<String> {

        @Override
        public void onMessage(String msg) {
            System.out.println("TimlineListener onMessage" + msg);
        }
}

2.抽象subject接口,主题

interface Subject<T> {
        void add(Listener listener); // 添加listener
        void del(Listener listener); // 删除listener

        void notifyListeners(T t); // 通知监听者
        void operation(String message);
}

抽象父类abstractSubject

abstract static class AbstractSubject<T> implements Subject<T> {
        private CopyOnWriteArrayList<Listener> listeners = new CopyOnWriteArrayList<>();

        @Override
        public void add(Listener listener) {
            listeners.add(listener);
        }

        @Override
        public void del(Listener listener) {
            listeners.remove(listener);
        }

        @Override
        public void notifyListeners(T t) {
            Iterator<Listener> iterator = listeners.stream().iterator();
            while (iterator.hasNext()){
                iterator.next().onMessage(t);
            }
        }
    }

主题实现类MySubject

class MySubject extends AbstractSubject {

        @Override
        public void operation(String message) {
            System.out.println(message + "already update");
            String result = message + "already update";
            notifyListeners(result);
        }
}

2.使用

public static void main(String[] args) {
        Subject subject = new MySubject();
        subject.add(new EmailListener());
        subject.add(new TimLineListener());
        subject.operation("3");
}
posted @ 2022-11-04 14:33  SpecialSpeculator  阅读(20)  评论(0编辑  收藏  举报