设计模式----观察者模式Observer

本文详细介绍了Observer模式的概念及其在Java中的具体实现方式。通过一个具体的示例,展示了如何使用Java内置的`java.util.Observable`类来实现Subject和Observer之间的状态同步。此外,还介绍了如何注册观察者并触发状态更新。

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

Observer模式

Observer模式的功用,是希望两个(或多个)对象,我们称之为Subject和Observer,当一方的状态发生改变的时候,另一方能够得到通知。也就是说,作为Observer的一方,能够监视到Subject的某个特定的状态变化,并为之做出反应。


Java代码实现
import java.util.Observable;
//被观察的对象,需要继承 Observable 而且在方法中,必须要this.setChanged(),
//只有这样,观察者才能被通知到
public class SubjectObservable extends Observable{

   public void changeDate(){
        System.out.println("SubjectObservable changeDate");
        this.setChanged();
    }
}

class Subject{
    SubjectObservable f = new SubjectObservable();
//注册观察者
    public void registerObserver(java.util.Observer o){
        f.addObserver(o);
    }
    void changeSubject(){
        f.changeDate();
//通知观察者,这里的通知,只有f的this.setChanged()触发后才生效。
        f.notifyObservers();
    }
}
//一号观察者,需要实现 java.util.Observer ,并且 要重写update() 方法
 class SubjectObserver  implements java.util.Observer {
      public void update(Observable o, Object arg) {
          SubjectObservable subject=(SubjectObservable) o;
         System.out.println("SubjectObserver work ");
      }
    }
 //二号观察者,同样需要实现 java.util.Observer ,并且 要重写update() 方法
 class SubjectObserver2  implements java.util.Observer {
      public void update(Observable o, Object arg) {
          SubjectObservable subject=(SubjectObservable) o;
         System.out.println("SubjectObserver2 work ");
      }
    }


Main函数
    public static void main(String args[]){
        Subject s = new Subject();
        SubjectObserver fm = new SubjectObserver();
        SubjectObserver2 fm2 = new SubjectObserver2();
//给s对象注册2个观察者
        s.registerObserver(fm2);
        s.registerObserver(fm);
        s.changeSubject();
    }

执行结果:
SubjectObservable  changeDate
SubjectObserver work
SubjectObserver2 work
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值