zoukankan      html  css  js  c++  java
  • Java观察者模式实例

    在观察者模式中,包括以下四个角色:

    • 主题(被观察者)(Subject):主题是一个接口,该接口规定了具体主题需要实现的方法,比如,添加、删除观察者以及通知观察者更新数据的方法。

    • 观察者(Observer):观察者是一个接口,该接口规定了具体观察者用来更新数据的方法。

    • 具体主题(ConcreteSubject):具体主题是实现主题接口类的一个实例,该实例包含有可以经常发生变化的数据。具体主题需使用一个集合,比如ArrayList,存放观察者的引用,以便数据变化时通知具体观察者。

    • 具体观察者(ConcreteObserver):具体观察者是实现观察者接口类的一个实例。具体观察者包含有可以存放具体主题引用的主题接口变量,以便具体观察者让具体主题将自己的引用添加到具体主题的集合中,使自己成为它的观察者,或让这个具体主题将自己从具体主题的集合中删除,使自己不再是它的观察者。

    实现案例: 不同的几个用户订阅了某个平台的消息,该平台发布一条消息后,所有的订阅者都可以接收到这条消息

    步骤一:定义一个被观察者(主题)接口

    /**
     * 定义一个被观察者(主题)接口
     */
    public interface ObserverSubject {
    
        public void registerObserver(Observer o);
    
        public void removeObserver(Observer o);
    
        public void notifyObserver();
    }
    
    

    步骤二:定义一个类实现被观察者(主题)接口

    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 具体主题类,实现主题接口
     */
    public class WecharSubject implements ObserverSubject {
    
        //    这个集合是实现“不知道有多少对象需要进行相应修改”的关键
        List<Observer> list = new ArrayList<>();
    
        String message;
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
            notifyObserver();
        }
    
        @Override
        public void registerObserver(Observer o) {
    //        将观察者对象添加进集合中
            list.add(o);
        }
    
        @Override
        public void removeObserver(Observer o) {
            if (!list.isEmpty())
                list.remove(o);
        }
    
        /**
         * 遍历更新消息
         */
        @Override
        public void notifyObserver() {
            for (Observer ll : list) {
                Observer observer = ll;
                observer.update(message);
            }
        }
    }
    
    

    步骤三:定义一个观察者接口,订阅消息的更新功能

    /**
     * 定义一个观察者接口
     */
    public interface Observer {
        public void update(String message);
    }
    
    

    步骤四:定义一个类实现观察者接口

    /**
     * 定义一个具体观察者,也就是订阅者
     */
    public class UserObserver implements Observer {
    
        String name;
        String message;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void read() {
            System.out.println(name + "收到推送的消息:" + message);
        }
    
        @Override
        public void update(String message) {
            this.message = message;
            read();
        }
    }
    
    

    添加用户进行消息订阅

    public class Test {
    
        @org.junit.Test
        public void test() {
            WecharSubject wecharSubject = new WecharSubject();
    
            UserObserver user = new UserObserver();
            user.setName("小明");
    
            UserObserver user1 = new UserObserver();
            user1.setName("小红");
    
    //        添加订阅者
            wecharSubject.registerObserver(user);
            wecharSubject.registerObserver(user1);
    
    //       给订阅者发布消息
            wecharSubject.setMessage("快把包子吃了");
    
        }
    
    
    }
    
    

  • 相关阅读:
    (转)nginx的root和alias指令的区别
    (转)Bash 快捷键 完整版
    (转)curl 命令使用
    Ansible 部署
    (转)把Sublime Text 2 加入右键菜单(带图标),Edit with Sublime Text
    配置IP地址及HOSTNAME脚本
    Linux Shell : Test命令参数解析
    计算阶乘 n! = 1 * 2 * 3 * ... * n
    .编写一个函数,输入n为偶数时,调用函数求1/2+】1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n
    简单的ATM机的取款过程
  • 原文地址:https://www.cnblogs.com/lyd447113735/p/14838387.html
Copyright © 2011-2022 走看看