观察者(Observer)模式标准定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
观察者(Observer)模式属于对象行为型模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。这一模式中主要针对两个对象object和Observer。一个object可以有多个Observer,当—个object对象的状态发生改变时,所有依赖于它的Observer对象都得到通知被自动更新。
在JDK中定义了观察者模式:
subject -> java.util.Observable(类)
observer -> java.util.Observer(接口)
使用jdk自带的观察者模式的缺点:
1.Observable是一个类,而不是一个接口,导致Observable类的扩展性不高,不如自己实现的观察者模式灵活。
2.Observable将某些方法保护了起来(setChanged()和clearChanged()为protected),这意味着除非继承自Observable,否则将有关键的方法不能调用。导致无法通过组合的方式使其它类获得Observable类的功能。
同时.Spring的事件驱动模型使用的是观察者模式。
示例:https://www.cnblogs.com/fingerboy/p/6393644.html
以下为自己代码实现的观察者模式,举例为主人(被观察者)和动物(观察者)的故事。
/**
*
* @describe:被观察者(主题)接口
*
*/
public interface Subject {
//添加观察者
public void addObserver(Observer obj);
//移除观察者
public void deleteObserver(Observer obj);
//当主题方法改变时,这个方法被调用,通知所有的观察者
public void notifyObserver();
}
/**
*
* @describe:定义一个主人的被观察这对象:男主人
*
*/
public class MasterSubject implements Subject,Runnable{
String name="男主人";
List<Observer> observers=new ArrayList<Observer>();
public void addObserver(Observer obj) {
if(!observers.contains(obj)){
observers.add(obj);
}
}
public void deleteObserver(Observer obj) {
if(observers.contains(obj)){
observers.remove(obj);
}
}
public void notifyObserver() {
for(Observer observer : observers){
observer.update(name);
}
}
@Override
public void run() {
try {
Thread.sleep(3000);
notifyObserver();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
*
* @describe:观察者接口
*
*/
public interface Observer {
public abstract void update(String name);
}
/**
*
* @describe:定义小狗观察者
*
*/
public class DogObserver implements Observer{
String message="汪汪汪";
@Override
public void update(String name) {
System.out.println(name+"回来了"+message);
}
}
/**
*
* @describe:定义小猫观察者
*
*/
public class CatObserver implements Observer{
String message="喵喵喵";
@Override
public void update(String name) {
System.out.println(name+"回来了"+message);
}
}
/**
*
* @describe:测试类
*
*/
public class Test {
public static void main(String[] args) {
MasterSubject subject=new MasterSubject();
Observer dog=new DogObserver();
Observer cat=new CatObserver();
subject.addObserver(dog);
subject.addObserver(cat);
new Thread(subject).start();
}
}
运行结果:
男主人回来了汪汪汪
男主人回来了喵喵喵