观察者模式实例解析

本文深入解析了观察者模式,介绍了模式的概念、类图结构,并通过实例详细展示了观察者类、主题类的设计与实现。文章还探讨了观察者模式的优点、缺点及适用场景,帮助读者理解并掌握这一设计模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

观察者模式实例解析

概述

         观察者模式,顾名思义就是“观察主题状态变更”,我们接触到的ServletContextListenerApplicationListener都是使用这种开发模式。从代码结构层面可以描述为主题对象保存所有关心此主题状态的观察者对象的引用,当状态变更时通知所有观察者对象。

 

类图

                             

【运行原理剖析】

Subject持有对Observer对象的引用,Observer的具体类(ConcreteObserver)持有对Subject具体类(ConcreteSubject)的引用,首先创建ConcreteSubject对象concreteSubject,在用此对象初始化创建ConcreteObserver对象ABC,这样就有了三个观察者,在通过concreteSubjectattach方法将ConcreteObserver对象ABC进行注册。这样当concreteSubject的状态subjectState改变时就可以通过调用notify方法通知所有的观察者注册对象,观察者则选择性的处理自己感兴趣的状态。当然也可以考虑下双向监听,互为主题和观察者,多主题多观察者的情况。

 

实例

观察者类

Observer.java

 

publicabstractclassObserver {

   publicabstractvoid update();

}

 

ConcreteObserver.java

publicclassConcreteObserver extends Observer{

   private String obverserState;

   private String name;

   private ConcreteSubject concreteSubject;

   

   public ConcreteSubjectgetConcreteSubject() {

      returnconcreteSubject;

   }

 

   publicvoidsetConcreteSubject(ConcreteSubject concreteSubject) {

      this.concreteSubject =concreteSubject;

   }

   

   public ConcreteObserver(ConcreteSubjectconcreteSubject,String name){

      this.concreteSubject =concreteSubject;

      this.name = name;

   }

   @Override

   publicvoid update() {

      this.obverserState = concreteSubject.getSubjectState();

      System.out.println("The obverser`s state of " + this.name + " is " + this.obverserState);

   }

}


 

 

主题类

Subject.java

publicabstractclassSubject {

   protectedList<Observer> observerList = newArrayList<Observer>();

   

   publicvoid attach(Observerobserver){

      observerList.add(observer);

   }

   

   publicvoid dettach(Observer observer){

      observerList.remove(observer);

   }

   

   publicvoid publish(){

      for(Observer o:observerList){

         o.update();

      }

   }

}


 

ConcreteSubject.java

publicclassConcreteSubject extends Subject{

   private String subjectState;

 

   public StringgetSubjectState() {

      returnsubjectState;

   }

 

   publicvoid setSubjectState(StringsubjectState) {

      this.subjectState = subjectState;

   }

   

}


 

 

测试类

TestDesignPattern.java

publicclassTestDesignPattern {

   publicstaticvoid main(String[] args){

      ConcreteSubjectconcreteSubject = new ConcreteSubject();

      

      concreteSubject.attach(newConcreteObserver(concreteSubject, "ObserverA"));

      concreteSubject.attach(newConcreteObserver(concreteSubject, "ObserverB"));

      concreteSubject.attach(newConcreteObserver(concreteSubject, "ObserverC"));

      

      concreteSubject.setSubjectState("Ready");

      concreteSubject.publish();

   }

}


 

 

运行结果

 

 

总结

优点

观察者模式解除了主题和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。从而使得各自的变化都不会影响另一边的变化。

缺点

依赖关系并未完全解除,抽象主题仍然依赖抽象观察者。(可以用代理模式解决,后续博文介绍此内容)

适用场景

Ø  当一个对象的改变需要给变其它对象时,而且它不知道具体有多少个对象有待改变时。

Ø  一个抽象类型有两个方面,当其中一个方面依赖于另一个方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱清清

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值