设计模式之观察者模式
观察者模式简介
观察者模式,二十三种设计模式之一,也是一种使用频率比较高的设计模式。在日常生活中,我们经常会碰到这样的情景,比如说某个事情发生了,我们希望通知到所有对这个事情关系的人,这个时候有两种方式,一种是关心这件事的人主动去询问发布这件事情的人;另外一种就是告诉这件事情的负责人,让他在这件事情发生的时候,告诉我们这件事情已经发生了。显然,第一种方式是属于主动模式,这种方式在这种情况下是比较不方便的,因为我们不知道这件事情什么时候会发生,所以我们需要不停地去询问负责人,这样效率就会变得非常低,而且不方便;第二种方式就是我们的观察者模式了,我们注册对应的事件,然后在该事件发生的时候,由负责人通知我们即可,这样我们就不需要关心它到底什么时候发生的了。
观察者模式的具体实现
/**
* 观察者接口
*/
interface Observer {
void update(Subject subject);
}
/**
* 对应的事件
*/
class Subject{
private List<Observer> observers ;
private int status;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
// 当状态改变的时候,通知所有的观察者
notifyAllObserver();
}
public Subject() {
this.observers = new ArrayList<>();
}
/**
* 注册观察者
* @param observer
*/
public void register(Observer observer){
observers.add(observer);
}
/**
* 移除观察者
* @param observer
*/
public void remove(Observer observer){
observers.remove(observer);
}
/**
* 通知所有的观察者
*/
private void notifyAllObserver(){
for (Observer obs:observers) {
obs.update(this);
}
}
}
/**
* 具体的观察者
*/
class ObserverOne implements Observer{
@Override
public void update(Subject subject) {
System.out.println( this + "Update : " + subject.getStatus());
}
}
/**
* 具体的观察者
*/
class ObserverTwo implements Observer{
@Override
public void update(Subject subject) {
System.out.println( this + "Update : " + subject.getStatus());
}
}
可以看到,我们只需要定义一个观察者接口,并且在对应事件提供注册的接口即可,这样,根据具体情况,可以有不同类型的观察者,主要他们对这个事情感兴趣,那么只需要注册一下该事情,当发生改变的时候,他们就都会受到通知,这跟生活中遇到的情况是一致的。
总结
观察者模式,是一种比较巧妙的设计模式,它将获得事件通知的控制权从用户转移到事件本身,使得用户可以从这个事件变化中解脱出来,观察者模式可以用于实现类似于广播、通知这一类型的模型。