业务场景
我们时常需要知道一些状态的变化,然后做相应的改变,比如“Android”手机中,监测到WIFI断开连接了,目前正在使用流量,做视频的APP,就需要提醒用户是否继续观看,如果我们单独启动一个“线程”来不断监测Wifi是否断开,性能将无比差,因为我们需要监测得实在是太多了,Android中,当WIFI状态发生变化,就通知各个APP(需要被通知的)WIFI状态发生变化,各个APP就会做对应的改变,这个就是Android的“广播机制”,那么这其实就是观察者模式
观察者模式
业务角色
同样的,我们定义4个角色
- 被观察者接口(ISubject):提供添加、删除、通知观察者
- 被观察者:比如上面的WIFI断开操作
- 观察者接口(IOberver):当被观察者有变化时,就会被通知
- 观察者:被通知后,有一个回调方法,类似Android中广播的回调方法
代码实现
- 被观察者接口,提供添加、删除、通知观察者方法
public interface ISubject{
void attach(IObserver observer); //添加观察者
void detach(IObserver observer); //删除观察者
void inform(); //通知所有观察者
}
- 被观察者:比如上面的WIFI断开操作
import java.util.Vector;
public class ConcreteSubject implements ISubject{
Vector<IObserver> observers=new Vector<IObserver>();
public void attach(IObserver observer){
observers.addElement(observer);
}
public void detach(IObserver observer){
observers.removeElement(observer);
}
public void inform(){
// 断开WIFI啦,赶快通知各个APP……
Event evt=new Event();
for(IObserver ob:observers){
ob.update(evt);
}
}
}
- 观察者接口(IOberver),观察者需要继承他
public interface IObserver{
void update(Event evt); //更新观察者
}
- 观察者,被通知后提醒用户是否继续观看视频
public class ConcreteObserver implements IObserver{
public void update(Event evt){
System.out.println("WIFI已经断开了,是否继续观看视频");
}
}