1. 简介
观察者模式,行为型设计模式。观察者模式在实际项目实践中,是一种使用较频繁的设计模式,它主要解决的是信息同步的问题,当多个对象需要从同一个主题中得到自身所需要的信息或状态,并通过这些信息或状态做出相应的行为时,就可以使用观察者模式解决。
2. 类图
如上所述,观察者模式中需要多个对象从同一个主题中获取所需的信息和状态。那么在观察者模式的设计结构中,包括如下几个角色:
- 抽象主题类:定义抽象主题的公共接口或成员。
- 具体主题类:定义具体主题的添加、注销、通知观察者等方法。
- 抽象观察者类:定义抽象观察者的公共接口。
- 具体观察者类:定义具体抽象类再获取主题状态后的行为方法。
3. 代码实例
如下是各电视台对气象局的观察示例代码:
package eaikao.observer;
import java.util.ArrayList;
abstract class ISubject {
private ArrayList<IObserver> observelist = new ArrayList<IObserver>();
public void attach(IObserver observer) {
observelist.add(observer);
}
public void detach(IObserver observer) {
observelist.remove(observer);
}
public void notify(String strInfo) {
for(IObserver observer : observelist) {
observer.update(strInfo);
}
}
}
class WeatherBureau extends ISubject {
private String weather;
public String getWeather() {
return weather;
}
public void change(String changeWeather) {
weather = changeWeather;
notify(changeWeather);
}
}
abstract interface IObserver {
public void update(String strInfo);
}
class CCTVBroadCaster implements IObserver {
@Override
public void update(String strInfo) {
// TODO Auto-generated method stub
System.out.println("CCTVBroadCaster:" + strInfo);
}
}
class SHANXIBroadCaster implements IObserver {
@Override
public void update(String strInfo) {
// TODO Auto-generated method stub
System.out.println("SHANXIBroadCaster:" + strInfo);
}
}
public class EObserver {
public static void main(String[] args) {
IObserver cctv = new CCTVBroadCaster();
IObserver shanxi = new SHANXIBroadCaster();
WeatherBureau bureau = new WeatherBureau();
bureau.attach(cctv);
bureau.attach(shanxi);
bureau.change("rain");
}
}
首先定义抽象主题类,然后定义气象局具体主题,当气象局的天气发生变化时,会通知已经注册再气象局的观察者们,观察者根据气象局的通知,做出相应的报道。
3. 说明
观察者模式解耦了具体的主题与观察者,解决了信息同步的问题。当然观察者模式也存在一定的缺点。
- 当观察者过多时,会影响程序的开发调试。
- 当其中一个观察者发生阻塞时,其余观察者都会阻塞,这会导致整个程序处于等待的状态。
- 当主题状态在程序中唯一时,若其中一个观察者更新方法中对观察参数进行修改,就会导致主题重新通知观察者,这样就会导致程序发生无线循环调用的风险,最终导致栈溢出,程序崩溃的问题。所以在观察者模式的设计过程中需要格外注意。