生活中我们经常遇到观察者模式的案例。
例如,我们去商场购物,注册了一家店的会员,一旦这家店有活动,你的手机就会收到一些推送消息,是不是?
在例如,我们看某个电视台的节目,这个电视台放什么节目我们就会看到什么节目。
这些都是典型的生产者与消费者的案例。
所谓的观察者模式,定义了一种一对多的依赖关系,能够让多个观察者订阅某个主题,当这个主题发生变化的时候,主题会通知这些订阅者,那么观察者就会自动更新变化。
我们以天气预告为例,tom和jack,都订阅了手机天气预告功能,那么天气预告会每天进行通知tom和jack,tom和jack就会收到天气预报,一旦天气预报发生变化,tom和jack也会收到这些通知。
下面看具体实现。
//===========Observer.java===============
//抽象类,观察者,具体的观察这将到子类实现
public abstract class Observer {
public abstract void update();
}
//===========Subject.java===============
//主题
public class Subject {
//保存多个观察者(就是订阅该主题的人)
private List observers=new ArrayList();
/**
* 增加观察者
* @param observer
*/
public void addObserver(Observer observer){
observers.add(observer);
}
/**
* 移除观察者
* @param observer
*/
public void removeObserver(Observer observer){
observers.remove(observer);
}
/**
* 通知观察者
*/
public void notifyObserver(){
for (Observer observer : observers) {
observer.update();
}
}
}
//===========ConcreteSubject.java===============
//具体的某个主题
public class ConcreteSubject extends Subject {
//主题消息内容
private String subjectState;
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
}
}
//===========ConcreteObserver.java===============
//具体的某个观察者
public class ConcreteObserver extends Observer {
private String name;
private String observerState;
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject subject,String name){
this.subject=subject;
this.name=name;
}
@Override
public void update() {
observerState=subject.getSubjectState();
System.out.println(String.format("%s的收到消息,内容是:%s", name,observerState));
}
}
//===========MainTest.java===============
public static void main(String[] args) {
//主题
ConcreteSubject subject=new ConcreteSubject();
//tom订阅主题
subject.addObserver(new ConcreteObserver(subject, "tom"));
//jack订阅主题
subject.addObserver(new ConcreteObserver(subject, "jack"));
//编写主题内容
subject.setSubjectState("今天下雨");
//发布主题,所有订阅主题的人都收到了
subject.notifyObserver();
//编写主题内容
subject.setSubjectState("根据最新气象显示,今天大部分地区将是雨转多云");
//发布主题,所有订阅主题的人都收到了
subject.notifyObserver();
}
我们看结果:
tom的收到消息,内容是:今天下雨
jack的收到消息,内容是:今天下雨
tom的收到消息,内容是:根据最新气象显示,今天大部分地区将是雨转多云
jack的收到消息,内容是:根据最新气象显示,今天大部分地区将是雨转多云
easy吧,完!