观察者设计模式
前言:
从现实角度来说,我们每一个人都是一个观察者,同时也是一个被观察者。
作为被观察;者,我们会发出一些信息,观察者在接收到这些信息后,会做出相应的反映;而作为观察者,我们是可以被“被观察者”所发出的信息影响的。
一个被观察者,可能存在多个观察者。也就是说,一个被观察者所发出的信息,可能会影响到多个观察者。
观察者设计模式:
定义了一种一对多的关联关系。一个对象A与多个对象B、C、D之间建立“被观察与观察关系”。
当对象A的状态发生改变时,通知所有观察者对象B、C. D。当观察者对象B、c、D在接收到A的通知后,根据自身实际情况,做出相应改变。
当然,观察者与被观察者指的都是具有某一类功能的对象、
结构说明:
代码:
IObserved:
public interface IObserved { /** * 接收数据信息 * @param demo */ void shuJu(String demo); }
IBeObserved:
public interface IBeObserved { /** * 添加观察者的方法 * @param observed */ void addObserved(IObserved observed); /** * 删除观察者的方法 * @param observed */ void removeObserved(IObserved observed); /** * 向观察者发送消息的方法 * @param data */ void sendObserved(String data); }
OneBeserved:
public class OneObserved implements IObserved { @Override public void shuJu(String demo) { System.out.println("一号观察者正在处理信息:" + demo); } }
TwoBeserved:
public class TwoObserved implements IObserved { @Override public void shuJu(String demo) { System.out.println("二号观察者正在处理信息:" + demo); } }
BeObserverSimp:
public class BeObserverSimp implements IBeObserved { /** * 定义观察者集合/ */ List<IObserved> list; public BeObserverSimp() { //在被观察者创建的时候,就创建观察者集合 list = new ArrayList<>(); } @Override public void addObserved(IObserved observed) { list.add(observed); } @Override public void removeObserved(IObserved observed) { list.remove(observed); } @Override public void sendObserved(String data) { //遍历集合调用每个观察者中的方法 for (IObserved observed : list) { observed.shuJu(data); } } }
测试类:
/** * @author zhangzhixi */ public class Test { public static void main(String[] args) { //创建观察者 OneObserved one = new OneObserved(); TwoObserved two = new TwoObserved(); //创建被观察者 BeObserverSimp bos = new BeObserverSimp(); //添加一号跟二号观察者 bos.addObserved(one); bos.addObserved(two); //删除一号观察者 bos.removeObserved(one); //向观察发送消息 bos.sendObserved("你好世界!"); } }
测试结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话