Java观察者模式实例代码分析
导读:本文共2289字符,通常情况下阅读需要8分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 优点1.观察者和被观察者是抽象耦合的。2.建立一套触发机制。缺点1.如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。2.如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。3.观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化... ...
目录
(为您整理了一些要点),点击可以直达。优点
1.观察者和被观察者是抽象耦合的。
2.建立一套触发机制。
缺点
1.如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2.如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
3.观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
使用场景
一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
一个对象必须通知其他对象,而并不知道这些对象是谁。
需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
注意事项
1.JAVA 中已经有了对观察者模式的支持类。
2.避免循环引用。
3.如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。
一、实现方式
1、观察者抽象类
packagecom.asurplus.common.observe;/***观察者*/publicabstractclassObserver{protectedSubjectsubject;/***发布事件*/publicabstractvoidupdate();}
2、第一个观察者
packagecom.asurplus.common.observe;importlombok.extern.slf4j.Slf4j;@Slf4jpublicclassObserver1extendsObserver{publicObserver1(Subjectsubject){this.subject=subject;this.subject.attach(this);}@Overridepublicvoidupdate(){log.info("观察者1收到通知:{}",this.subject.getState());}}
3、第二个观察者
packagecom.asurplus.common.observe;importlombok.extern.slf4j.Slf4j;@Slf4jpublicclassObserver2extendsObserver{publicObserver2(Subjectsubject){this.subject=subject;this.subject.attach(this);}@Overridepublicvoidupdate(){log.info("观察者2收到通知:{}",this.subject.getState());}}
4、第三个观察者
packagecom.asurplus.common.observe;importlombok.extern.slf4j.Slf4j;@Slf4jpublicclassObserver3extendsObserver{publicObserver3(Subjectsubject){this.subject=subject;this.subject.attach(this);}@Overridepublicvoidupdate(){log.info("观察者3收到通知:{}",this.subject.getState());}}
5、定义主题
packagecom.asurplus.common.observe;importjava.util.ArrayList;importjava.util.List;/***主题*/publicclassSubject{/***观察者列表*/privateList<Observer>observers=newArrayList<>();/***标志*/privateintstate;publicintgetState(){returnstate;}/***标识被改变**@paramstate*/publicvoidsetState(intstate){this.state=state;//通知所有观察者notifyAllObservers();}/***添加进接收者列表**@paramobserver*/publicvoidattach(Observerobserver){observers.add(observer);}/***通知所有人被改变*/publicvoidnotifyAllObservers(){for(Observerobserver:observers){observer.update();}}}
类似于消息发布一样,有多个接收者,当标志位被改变的时候,通知多个接收者。
二、测试
packagecom.asurplus.common.observe;publicclassTestMain{publicstaticvoidmain(String[]args){//创建主题Subjectsubject=newSubject();//添加观察者newObserver1(subject);newObserver2(subject);newObserver3(subject);//改变标志subject.setState(10);}}
输出结果
可以看出,三个接收者都收到了事件通知,从而实现了我们的观察者模式。
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
Java观察者模式实例代码分析的详细内容,希望对您有所帮助,信息来源于网络。