设计模式二:观察者模式

观察者模式是一种非常有用的设计模式。

原理:观察者设计模式定义了对象间的一种一对多的依赖关系,当一个对象(或对象列表)的行为依赖于另一个对象的状态时,状态发生变化时,依赖它的对象(或其维护的对象列表)将得到通知并自动刷新。

例子:比如老板在一个办公室里开会,办公室里有部分员工,在办公室的员工就是
Observer(观察者),正在开会的老板就是Subject(主题:负责发送通知—Post Notification)。如果其他员工也想成为Observer,那么必须得进入(addObserver)正在开会的会议室成为观察者。员工成功观察者后收到通知得做一些事情吧(doSomething),比如记个笔记神马的。如果此时员工闹情绪,不想听老板开会了,于是通过removeObserver走出了会议室。上面这个过程其实就是观察者模式。(这段话摘自哪里记不得了,反正不是自己想出来的!)

1、观察者模式结构:
这里写图片描述

上述剖析:ISubject是被观察对象,可以增、删观察者。IObserve是观察者,它依赖于ISubject的状态变化。ISubject状态发生变化时,会调用inform方法通知观察者。

2、观察者模式角色:
这里写图片描述

3、观察者模式角色:
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

4、JDK内部有一套观察者模式的实现:
java中的内置观察者模式有两个类:一个是observable被观察者类,一个是observer观察者接口。大体上与自定义模式相同,我们编写程序时只需继承obervable类,具体实现observer接口就可以了。

二者关系如下:
这里写图片描述

值得注意的是:调用notifyObservers()方法之前,必须先调用setChanged()方法。这是因为observable类中把changed变量初始化为false,notifyObservers()方法会先检查该变量是否为true,如果不为ture,就不会调用update()方法,这就要我们调用notifyObservers()之前,先用setChanged()方法将changed变量设置为true。

  1. import java.util.Observable;  
  2. import java.util.Observer;  
  3.   
  4. class Observeadf extends Observable {  
  5.     // 程序的入口  
  6.     public static void main(String args[]) {  
  7.         Observeadf watched = new Observeadf();// 创建被观察对象  
  8.         FirstObserver watch = new FirstObserver();// 创建观察者对象(可以创建多个)  
  9.         watched.addObserver(watch);  
  10.         watched.toWatchers("你好!");  
  11.     }  
  12.   
  13.     // 通知观察者的方法  
  14.     public void toWatchers(String str) {  
  15.             this.setChanged();// 被观察者发生变化,把changed设置为true  
  16.             this.notifyObservers(str);// 通知观察者  
  17.         }  
  18. }  
  19.   
  20. class FirstObserver implements Observer {  
  21.     // 重写更新方法  
  22.     public void update(Observable o, Object arg) {  
  23.         System.out.println("被观察者发生变化,观察者已收到通知:"+arg);  
  24.     }  
  25. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值