观察者模式
观察者模式,其实有点类似订阅。
角色:观察者,被观察者,一个被观察者与观察者是一对多的关系。
直白解析:
被观察者A,观察者B,观察者C.
A被B和C同时观察,当A发生改变,B和C都感知到变化。
要求:
实现观察者模式时要注意具体目标对象和具体观察者对象之间不能直接调用,否则将使两者之间紧密耦合起来,这违反了面向对象的设计原则。
模式的结构
观察者模式的主要角色如下。
- 抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
- 具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
- 抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
- 具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。
下面代码直接复制运行就可以:
package com.shandiangou.trade.controller.service.impl;
import java.util.ArrayList;
import java.util.List;
public class test {
public static void main(String[] args) {
Rate rate = new RMBrate();
Bank nonghangBank = new NonghangBank();
Bank renminBank = new RenminBank();
rate.add(nonghangBank);
rate.add(renminBank);
rate.change(15);
rate.change(-10);
}
}
//抽象目标:汇率
abstract class Rate {
protected List<Bank> banks = new ArrayList<Bank>();
//增加观察者方法
public void add(Bank bank) {
banks.add(bank);
}
//删除观察者方法
public void remove(Bank bank) {
banks.remove(bank);
}
public abstract void change(int number);
}
//具体目标:人民币汇率
class RMBrate extends Rate {
public void change(int number) {
for (Bank obs : banks) {
((Bank) obs).response(number);
}
}
}
//抽象观察者:银行
interface Bank {
void response(int number);
}
//具体观察者1:农行
class NonghangBank implements Bank {
public void response(int number) {
if (number > 0) {
System.out.println("人民币汇率升值" + number + "个基点,农行小挣10个亿。");
} else if (number < 0) {
System.out.println("人民币汇率贬值" + (-number) + "个基点,农行小亏10个亿。");
}
}
}
//具体观察者2:人民银行
class RenminBank implements Bank {
public void response(int number) {
if (number > 0) {
System.out.println("人民币汇率升值" + number + "个基点,人民银行小挣15个亿。");
} else if (number < 0) {
System.out.println("人民币汇率贬值" + (-number) + "个基点,人民银行小亏15个亿。");
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)