前言
之前零零散散看了一些有关设计模式的博客,没有好好总结归纳。最近就想好好学学设计模式以及相关的应用场景,并且通过博客记录下这个过程。
这系列博客主要分为设计模式的概述、示例和总结这三个方面。
概述
观察者模式,顾名思义就是观察与被观察的关系,比如你在烧开水得时时看着它开没开,你就是观察者,水就是被观察者;再比如说你在带小孩,你关注她是不是饿了,是不是喝了,是不是撒尿了,你就是观察者,小孩就是被观察者。
被观察者对象在状态或内容发生变化时,会通知所有观察者对象,使它们能够做出相应的变化(如自动更新自己的信息)。
示例
实现思路:
- 时间作为被观察者,当自身状态(时间)发生改变时,就通知所有观察者
- 起床行为和睡觉行为作为观察者,当时间发起通知时,根据时间状态执行各自的行为
类的关系如图所示:
观察者接口
public interface Observer {
/**
* 当被观察者发生变化时,执行此方法
* @param o
*/
void observe(Observable o);
}
被观察者接口
public interface Observable {
/**
* 添加观察者
* @param o
*/
void addObserver(Observer o);
/**
* 移除观察者
* @param o
*/
void removeObserver(Observer o);
/**
* 通知所有观察者
*/
void notifyAllObservers();
}
起床(观察者)
public class GetUpObserver implements Observer {
@Override
public void observe(Observable o) {
if (o instanceof TimeModel){
if ("8:00".equalsIgnoreCase(((TimeModel) o).getNow())){
System.out.println("8:00am,开始起床。。。");
}
}
}
}
睡觉(观察者)
public class SleepObserver implements Observer {
@Override
public void observe(Observable o) {
if (o instanceof TimeModel){
if ("20:00".equalsIgnoreCase(((TimeModel) o).getNow())){
System.out.println("8:00pm,开始睡觉。。。");
}
}
}
}
时间(被观察者)
public class TimeModel implements Observable {
private String now;
private List<Observer> observers = new ArrayList<>();
@Override
public void addObserver(Observer o) {
this.observers.add(o);
}
@Override
public void removeObserver(Observer o) {
this.observers.remove(o);
}
@Override
public void notifyAllObservers() {
for (Observer o : observers){
o.observe(this);
}
}
/**
* 当更改状态时,通知所有观察者
* @param now
*/
public void setNow(String now) {
this.now = now;
this.notifyAllObservers();
}
public String getNow() {
return now;
}
}
测试
public class ObserverTest {
public static void main(String[] args) {
/**
* 实现思路:
* 时间作为被观察者,当自身状态(时间)发生改变时,就通知所有观察者
* 起床行为和睡觉行为作为观察者,当时间发起通知时,根据时间状态执行各自的行为
*/
TimeModel timeModel = new TimeModel();
// 添加观察者
timeModel.addObserver(new GetUpObserver());
timeModel.addObserver(new SleepObserver());
// 更改状态,通知所有观察者
timeModel.setNow("8:00");
// 更改状态,通知所有观察者
timeModel.setNow("20:00");
}
}
总结
- 当我们需要根据观察对象的行为或属性的变化做出多种不同的措施时,只需要将对应的观察者加入被观察对象的观察者队列中。当被观察对象发生变化时,就会通知所有观察者,然后不同的观察者根据对象的状态做出不同的措施。
- 发布-订阅模式也属于观察者模式,可以看作订阅方观察发布方,当发布方将消息发布出去时,所有订阅方就收到来自发布方的通知。(这个过程中也可以将队列作为消息传送的介质)
- 。。。