• 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("快把包子吃了");
    
        }
    
    
    }
    
    

  • 相关阅读:
    转换上午下午 时间
    Canvas
    DOS Card (线段树)(hud杭电多校)
    ShuanQ (取模的小知识)(杭电多校)
    Painting Game (博弈论)
    Two Permutations (DP搜索的方式) (2022杭电多校3)
    Slayers Come (区间覆盖种类数(dp+线段树)+ st表+二分,或者线段树) (2022杭电多校2)
    copy (倒叙离线+bitset+^特性) (hud 2022多校 2)
    Static Query on Tree (述链剖分+线段树)(2022杭电多校)
    Fast Bubble Sort (单调zai+倍增) (2022杭电多校10)
  • 原文地址:https://www.cnblogs.com/lyd447113735/p/14838387.html
Copyright © 2020-2023  润新知