观察者模式作为设计模式之一:在各个项目中都有大量的引用,例如Listener。
观察者模式的关键是:被观察者产生了变化或者达到一定要求,就通知观察者。而不是观察者时刻去检查被观察者的状态。
举例一:天气变化,显示牌显示气温
天气:被观察者
显示牌:观察者。
气象站:客户端。
天气发生了变化,气象站作为客户端需要调用被观察者的提醒方法,提醒观察者。
举例二:Android鼠标点击按钮
被观察者:按钮
观察者:onClickListener
客户端:鼠标
举例三:spring启动,spring启动需要加载配置文件,会有n个ContextLoaderListener implments ServletContextListener
被观察者:spring配置文件
观察者:ContextLoaderListener
客户端:tomcat容器
类图:
观察者接口
interface Observer{
void update(String message);
}
观察者实现类:
class ConcreteObServer implements Observer{
@Override
public void update(String message) {
System.out.println(message);
}
}
被观察者接口:
interface BeObserver{
void addObserver(Observer observer);
void remObserver(Observer observer);
void notifyObserver(String message);
}
被观察者实现类
class ConcreteBeObServer implements BeObserver{
List<Observer> list=new ArrayList<>();
@Override
public void addObserver(Observer observer) { //添加观察者的操作由客户端调用
list.add(observer);
}
@Override
public void remObserver(Observer observer) {
list.remove(observer);
}
@Override
public void notifyObserver(String msg) { //遍历观察者集合,通知观察者
for(Observer observer:list)
observer.update("天气改变了,变成了 "+msg);
}
}
public static void main(String[] args) {
BeObserver beObserver = new ConcreteBeObServer();
Observer o1 = new ConcreteObServer();
Observer o2=new ConcreteObServer();
beObserver.addObserver(o1);
beObserver.addObserver(o2);
int now = 23; //当前温度为23
now++;//气温变化
beObserver.notifyObserver(now + "");
}
结果:
天气改变了,变成了 24
天气改变了,变成了 24