监听与回调的三个demo

Demo 1: 单观察者回调(有返回值)

java 复制代码
// ========= AAA类:单观察者回调 =========
public class CalculatorManager {
    // 1. 定义有返回值的接口
    public interface CalculationCallback {
        int calculate(int a, int b);  // ← 有返回值
    }
    
    private CalculationCallback callback; // ← 单例
    
    public void setCallback(CalculationCallback callback) {
        this.callback = callback; // ← 用set,覆盖旧值
    }
    
    public void compute(int x, int y) {
        // 2. 调用回调并依赖返回值做决策
        int result = callback.calculate(x, y);
        System.out.println("计算结果: " + result);
    }
}

// ========= BBB类:使用单观察者回调 =========
public class Main {
    public static void main(String[] args) {
        CalculatorManager manager = new CalculatorManager();
        
        // 3. 设置加法策略
        manager.setCallback(new CalculatorManager.CalculationCallback() {
            @Override
            public int calculate(int a, int b) {
                System.out.println("执行加法: " + a + "+" + b);
                return a + b;
            }
        });
        manager.compute(2, 3); // 输出: 执行加法: 2+3  计算结果: 5
        
        // 4. 覆盖为乘法策略(旧的被替换)
        manager.setCallback(new CalculatorManager.CalculationCallback() {
            @Override
            public int calculate(int a, int b) {
                System.out.println("执行乘法: " + a + "*" + b);
                return a * b;
            }
        });
        manager.compute(2, 3); // 输出: 执行乘法: 2*3  计算结果: 6
    }
}

Demo 2: 单观察者监听(无返回值)

java 复制代码
// ========= AAA类:单观察者监听 =========
public class Button {
    // 1. 定义无返回值的接口
    public interface OnClickListener {
        void onClicked();  // ← 无返回值
    }
    
    private OnClickListener listener; // ← 单例
    
    public void setOnClickListener(OnClickListener listener) {
        this.listener = listener; // ← 用set
    }
    
    public void performClick() {
        System.out.println("按钮被点击");
        // 2. 通知监听者(不依赖返回值)
        listener.onClicked();
    }
}

// ========= BBB类:使用单观察者监听 =========
public class Main {
    public static void main(String[] args) {
        Button button = new Button();
        
        // 3. 设置点击监听
        button.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClicked() {
                System.out.println("监听器响应: 显示Toast提示");
            }
        });
        
        button.performClick(); // 输出: 按钮被点击  监听器响应: 显示Toast提示
        
        // 4. 覆盖为新监听(旧的被替换)
        button.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClicked() {
                System.out.println("新监听器响应: 关闭页面");
            }
        });
        
        button.performClick(); // 输出: 按钮被点击  新监听器响应: 关闭页面
    }
}

Demo 3: 多观察者监听(无返回值)

java 复制代码
// ========= AAA类:多观察者监听 =========
public class TemperatureSensor {
    // 1. 定义无返回值的接口
    public interface TemperatureListener {
        void onTemperatureChanged(float temperature);  // ← 无返回值
    }
    
    private List<TemperatureListener> listeners = new ArrayList<>(); // ← 用List
    
    public void addListener(TemperatureListener listener) {
        listeners.add(listener); // ← 用add,不覆盖
    }
    
    public void setTemperature(float temp) {
        System.out.println("温度传感器: 温度变为 " + temp + "°C");
        // 2. 通知所有监听者(每个都执行,互不干扰)
        for (TemperatureListener listener : listeners) {
            listener.onTemperatureChanged(temp);
        }
    }
}

// ========= BBB类:使用多观察者监听 =========
public class Main {
    public static void main(String[] args) {
        TemperatureSensor sensor = new TemperatureSensor();
        
        // 3. 添加第一个监听者:空调
        sensor.addListener(new TemperatureSensor.TemperatureListener() {
            @Override
            public void onTemperatureChanged(float temperature) {
                System.out.println("空调响应: 温度" + temperature + "°C,准备调节风速");
            }
        });
        
        // 4. 添加第二个监听者:温度记录仪
        sensor.addListener(new TemperatureSensor.TemperatureListener() {
            @Override
            public void onTemperatureChanged(float temperature) {
                System.out.println("记录仪响应: 温度" + temperature + "°C,已记录到日志");
            }
        });
        
        // 5. 添加第三个监听者:报警器
        sensor.addListener(new TemperatureSensor.TemperatureListener() {
            @Override
            public void onTemperatureChanged(float temperature) {
                if (temperature > 30) {
                    System.out.println("报警器响应: 温度" + temperature + "°C,超过30°C,触发报警!");
                }
            }
        });
        
        // 6. 温度变化,所有监听者都收到通知
        sensor.setTemperature(25.5f); // 输出: 三个监听器都响应
        sensor.setTemperature(31.0f); // 输出: 三个监听器都响应,报警器触发
    }
}
相关推荐
热爱编程的小刘2 分钟前
Lesson05&6 --- C&C++内存管理&模板初阶
开发语言·c++
爬山算法6 分钟前
Hibernate(85)如何在持续集成/持续部署(CI/CD)中使用Hibernate?
java·ci/cd·hibernate
菜鸟233号39 分钟前
力扣647 回文子串 java实现
java·数据结构·leetcode·动态规划
qq_12498707531 小时前
基于Java Web的城市花园小区维修管理系统的设计与实现(源码+论文+部署+安装)
java·开发语言·前端·spring boot·spring·毕业设计·计算机毕业设计
h7ml1 小时前
查券返利机器人的OCR识别集成:Java Tesseract+OpenCV优化图片验证码的自动解析方案
java·机器人·ocr
野犬寒鸦1 小时前
从零起步学习并发编程 || 第五章:悲观锁与乐观锁的思想与实现及实战应用与问题
java·服务器·数据库·学习·语言模型
Volunteer Technology1 小时前
Sentinel的限流算法
java·python·算法
岁岁种桃花儿1 小时前
SpringCloud从入门到上天:Nacos做微服务注册中心
java·spring cloud·微服务
jdyzzy1 小时前
什么是 JIT 精益生产模式?它与传统的生产管控方式有何不同?
java·大数据·人工智能·jit
Chasmれ1 小时前
Spring Boot 1.x(基于Spring 4)中使用Java 8实现Token
java·spring boot·spring