Java设计模式之观察者模式
概论
什么是观察者模式呢?观察者模式也叫发布订阅模式。定义对象间一种一对多的依赖关系,是的每当一个对象改变了状态,则所有依赖于它的对象都会得到通知并且自动更新。
观察者模式示例
首先我们定义一个抽象的观察者:
1 public interface Observer { 2 3 public void update(); 4 }
一般定义为接口,第3行,提供一个接口用于接收被观察者的动态。我们再增加一个具体的观察者:
1 public class ConcreateObserver implements Observer { 2 3 @Override 4 public void update() { 5 System.out.println("接受到被观察者的通知,并且处理"); 6 } 7 }
我们定义一个抽象的被观察者。被观察者的职责是能够动态的增加观察者和删除观察者,并且行为的改变能够通知所有的观察者。增加和删除这两个动作我们叫做管理。于是抽象的被观察者的责任就是管理观察者,同时及时把动态通知观察者。
1 public abstract class AbstractSubject { 2 3 private List<Observer> observers = new ArrayList<Observer>(); 4 5 public abstract void proccess(); 6 7 public void add(Observer observer) { 8 if(observer == null) { 9 return; 10 } 11 12 this.observers.add(observer); 13 } 14 15 public void remove(Observer observer) { 16 this.observers.remove(observer); 17 } 18 19 public void notifyObservers() { 20 21 observers.forEach(item -> { 22 item.update(); 23 }); 24 25 } 26 27 28 }
第3行,定义一个集合用来存储订阅的观察者。
第7行-14行,增加一个观察者。
第15行-17行,删除一个观察者。
第19行-25行,通知所有的观察者。
再来看看具体的被观察者:
1 public class ConcreateSubject extends AbstractSubject { 2 3 @Override 4 public void proccess () { 5 System.out.println("执行业务逻辑...."); 6 super.notifyObservers(); 7 } 8 }
第5行,执行具体的业务逻辑。
第6行,被观察者的业务发生了变化,需要通知所有的观察者。调用父类的方法。
最后我们增加一个场景类Client:
1 public class Client { 2 3 public static void main(String[] args) { 4 AbstractSubject subject = new ConcreateSubject(); 5 Observer observer = new ConcreateObserver(); 6 7 subject.add(observer); 8 subject.add(observer); 9 10 subject.proccess(); 11 } 12 }
我们先执行一下结果:
执行业务逻辑....
接受到被观察者的通知,并且处理
接受到被观察者的通知,并且处理
观察者模式的优缺点
1.观察者和被观察者之间是抽象耦合。
2.建立一套触发机制。
观察者较多时,容易造成阻塞,因此可以采用异步的方式通知。
发表是最好的记忆,实践是最好的成长。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥