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); // 输出: 三个监听器都响应,报警器触发
}
}