• 基于枚举实现的观察者模式




    前言

    本文介绍使用枚举的方式实现的观察者模式,简单易用,容易维护,非常适合日常的开发使用。


    一、观察者

    1.定义一个观察者接口

    //  定义一个观察者接口,用于观察主题对象的状态变化
    public interface Observer {
    
        // 发布消息
        void update(String message);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.察者接口具体实现类

    package com.jareny.jave.design.observer.object.base;
    
    //  实现观察者接口的具体类,用于观察主题对象的状态变化
    public class ConcreteObserver implements Observer{
        @Override
        public void update(String message) {
            System.out.println("观察到主题对象的状态变化,具体类收到通知:" + message);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    二、主题

    1.定义一个主题接口

    package com.jareny.jave.design.observer.object.base;
    
    //  定义一个主题接口,被观察者接口,用于通知观察者对象状态变化
    public interface Subject {
        //  注册观察者
        void registerObserver(Observer observer);
    
        //  删除观察者
        void removeObserver(Observer observer);
    
        //  通知观察者
        void notifyObservers(String message);
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2.主题接口具体实现类

    package com.jareny.jave.design.observer.object.base;
    
    import java.util.ArrayList;
    import java.util.List;
    
    //  实现主题接口,被观察者接口的具体类,用于通知观察者对象状态变化
    public class ConcreteSubject implements Subject {
        private List observers = new ArrayList<>();
    
        @Override
        public void registerObserver(Observer observer) {
            observers.add(observer);
        }
    
        @Override
        public void removeObserver(Observer observer) {
            observers.remove(observer);
        }
    
        @Override
        public void notifyObservers(String message) {
            observers.forEach(observer->observer.update(message));
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    三、枚举维护观察者

    1.定义枚举类维护观察者

    package com.jareny.jave.design.observer.object.enums;
    
    import com.jareny.jave.design.observer.object.base.ConcreteObserver;
    import com.jareny.jave.design.observer.object.base.Observer;
    import com.jareny.jave.design.observer.object.base.Subject;
    import lombok.AllArgsConstructor;
    import lombok.Getter;
    
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    @Getter
    @AllArgsConstructor
    public enum ObserverEnum {
        /**
         * 第一个观察者
         */
        Observer1("张三","学生"){
            @Override
            public void register(Subject subject) {
                // 创建观察者对象1
                Observer observer = new ConcreteObserver();
                // 主题对象注册观察者对象1
                subject.registerObserver(observer);
            }
        },
        /**
         * 第二个观察者
         */
        Observer2("李四","老师"){
            @Override
            public void register(Subject subject) {
                // 创建观察者对象2
                Observer observer = new ConcreteObserver();
                // 主题对象注册观察者对象2
                subject.registerObserver(observer);
            }
        },
    
        ;
    
        //  名称
        private String name;
    
        //  类型
        private String type;
    
        /**
         * 注册观察者
         * @param subject
         */
       public abstract void register(Subject subject);
    
        /**
         * 获取所以的观察者
         * @return
         */
       public static List getObserverEnumList(){
           return Stream.of(values()).collect(Collectors.toList());
       }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    四、观察者模式测试

    1.定义观察者模式测试接口

    
    package com.jareny.jave.design.observer.object.enums;
    
    import com.jareny.jave.design.observer.object.base.ConcreteObserver;
    import com.jareny.jave.design.observer.object.base.ConcreteSubject;
    import com.jareny.jave.design.observer.object.base.Observer;
    import com.jareny.jave.design.observer.object.base.Subject;
    
    import java.util.List;
    
    public class ObserverEnumExample {
        public static void main(String[] args) {
            // 创建主题对象
            Subject subject = new ConcreteSubject();
    
            // 创建观察者对象列表
            List observerEnumList = ObserverEnum.getObserverEnumList();
    
            // 观察者对象全部注册到主题对象
            observerEnumList.forEach(observer->observer.register(subject));
    
            // 主题对象通知所有观察者对象状态变化
            subject.notifyObservers("主题对象状态发生变化!");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    使用枚举,将观察者注册到订阅的主题种


    2.观察者模式测试运行结果

    运行程序,得到以下结果

    观察到主题对象的状态变化,具体类收到通知:主题对象状态发生变化!
    观察到主题对象的状态变化,具体类收到通知:主题对象状态发生变化!
    
    • 1
    • 2
  • 相关阅读:
    YoloV5和YoloV8的魔力成为你在CS:GO2中的秘密武器。四步完成,CSGO2人物图像识别
    Bash脚本学习:AWK, SED
    spring 事务方式和事务传播
    vue中响应式的步骤
    VMware 虚拟机安装 CentOS 7
    python基本类型
    看神州数码如何借助连接型CRM打破数据孤岛,让多系统发挥价值
    Vue2 基础一指令
    如何分分钟理解SVM(中文版)
    JVM线程安全
  • 原文地址:https://blog.csdn.net/weixin_39956506/article/details/133848140