观察者模式

观察者模式

1.观察者模式原理

观察者模式定义:简单地说,观察者定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象,这样一个主题对象在状态的变化就能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。

2.观察者模式实现:

  • 具体被观察者接口:
package com.lili.observer;

/**
 * 被观察者接口
 *
 * @author: QiJingJing
 * @create: 2021/7/18
 */


public interface MessageSubject {
    /**
     * 注册观察者
     */
    void registerObserver(Observer o);

    /**
     * 移除观察者
     */
    void removeObserver(Observer o);

    /**
     * 通知所有观察者
     */
    void notifyObservers();
}
  • 具体观察者接口:

    package com.lili.observer;
    
    /**
     * 观察者接口
     *
     * @author: QiJingJing
     * @create: 2021/7/18
     */
    public interface Observer {
        /**
         * 更新消息
         */
        public void update(String message);
    }
    
  • 被观察者实现:

    package com.lili.observer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 具体的被观察者对象
     *
     * @author: QiJingJing
     * @create: 2021/7/18
     */
    public class Message implements MessageSubject {
        // 维护的观察者列表
        private List<Observer> list = new ArrayList<>();
        private String message;
    
        public void setMessage(String message) {
            this.message = message;
            notifyObservers();
        }
    
        @Override
        public void registerObserver(Observer o) {
            list.add(o);
        }
    
        @Override
        public void removeObserver(Observer o) {
            list.remove(o);
        }
    
        @Override
        public void notifyObservers() {
            for (Observer observer : list) {
                observer.update(message);
            }
        }
    }
    
  • 观察者实现:

    package com.lili.observer;
    
    /**
     * 具体的被观察者对象
     *
     * @author: QiJingJing
     * @create: 2021/7/18
     */
    public class User implements Observer {
        private String name;
    
        public User(String name) {
            this.name = name;
        }
    
        @Override
        public void update(String message) {
            System.out.println("[" + name + "]" + "收到消息:" + message);
        }
    }
    
  • 测试代码:

    package com.lili.observer;
    
    /**
     * @author: QiJingJing
     * @create: 2021/7/18
     */
    public class Test {
        @org.junit.Test
        public void testObserver() {
            // 创建一个被观察者对象
            Message message = new Message();
            // 创建三个观察者对象
            Observer user1 = new User("lili");
            Observer user2 = new User("tom");
            Observer user3 = new User("vice");
            message.registerObserver(user1);
            message.registerObserver(user2);
            message.registerObserver(user3);
            // 发出消息
            message.setMessage("亲们,么么哒");
        }
    }
    

运行结果:

[lili]收到消息:亲们,么么哒
[tom]收到消息:亲们,么么哒
[vice]收到消息:亲们,么么哒

posted @   JamieChyi  阅读(61)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示