Java观察者模式实例代码分析(java,开发技术)

时间:2024-05-09 05:41:12 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    优点

    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);}}

    输出结果

    Java观察者模式实例代码分析

    可以看出,三个接收者都收到了事件通知,从而实现了我们的观察者模式。

     </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
    本文:Java观察者模式实例代码分析的详细内容,希望对您有所帮助,信息来源于网络。
    上一篇:C语言数据结构哈希表是什么下一篇:

    9 人围观 / 0 条评论 ↓快速评论↓

    (必须)

    (必须,保密)

    阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18