观察者模式

观察者模式

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

如何解决

抽象类里有一个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 @   SpecialSpeculator  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2021-11-04 排查inode被打满的问题
2021-11-04 python3.6环境安装
2016-11-04 AnsibleAPI源码剖析(1)-Runner类的 初始化
点击右上角即可分享
微信分享提示