Lambda表达式之观察者模式
在设计模式中我们讲述观察者模式的实现方式,这里着重讲述一下如何使用Lambda表达式实现观察者模式,从而达到让代码更加简洁和阅读性更好。
还是依据设计模式中观察者模式的相关对象进行展开:
定义观察者的接口,也就是观察者的响应接口。事实上这是一个函数式接口
public interface NewObserver { public void update(NewSubject subject); }
主题维护了一个接口对象的list集合,通过主题可以添加观察者,以及通知观察者自身内部的变化。
public class NewSubject { //维护一份观察者列表,以便动态地添加和删除 private List<NewObserver> observerList = new ArrayList<>(); private int state; public int getState(){ return state; } public void setState(int state){ this.state = state; notifyAllObservers(); } private void notifyAllObservers(){ //针对接口编程而不是实现编程 for(NewObserver observer : observerList){ observer.update(this); } } public void attach(NewObserver observer){ observerList.add(observer); } }
向主题列表中一般会添加具体的观察者,也就是实现了观察者接口的具体类对象,但是我们这里考虑到观察者接口是一个函数式接口,想利用lambda表达式的特性做一点事情,进而省去创建具体的观察者。下面我们直接看客户端代码,主题是如何通知变化的:
public class NewSubjectTest extends TestCase { public void testLambdaImplObserver(){ NewSubject subject = new NewSubject(); subject.attach((NewSubject)->{System.out.println("Binary String:" + Integer.toBinaryString(subject.getState()));}); subject.attach((NewSubject)->{System.out.println("HexObserver String: "+Integer.toHexString(subject.getState()));}); subject.attach((NewSubject)->{System.out.println("OctalObserver String:"+Integer.toOctalString(subject.getState()));}); subject.setState(12); }
测试结果:
Binary String:1100
HexObserver String: c
OctalObserver String:14
观察者何时实现时采用Lambda表达式还是传统的类,取决于观察者代码的复杂度。我这里所举的例子代码很简单,只是一个方法调用,很适合使用Lambda表达式实现。然而在有些情况下,观察者本身就是一个很复杂的类,这时将很多代码塞进一个方法中会大大降低代码的可读性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)