版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41376740/article/details/82529681
何为观察者模式
观察者,就是这样的几个问题:
- 谁是观察者
- 观察什么
- 做出反应
举个例子,小王小明小李,三个人去看烟花,烟花绽放了,小王说:哇塞 好漂亮哦,小明说:真的好美哦。小李说,我想找女票了。
我们可以看到,这里面有3个人,它们看烟花,并各自发出了赞叹。小王,小明,小李这三个人就是观察者,观察什么呢?烟花。烟花绽放,是被观察者的行为,于是这三个观察者都发出了各自的慨叹。
类图
代码:
主题类:
import java.util.ArrayList;
public class Subject {
private String state;
private ArrayList<Observer> observers = new ArrayList<>();
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public void addObserver(Observer o) {
this.observers.add(o);
}
public void removeObserver(Observer o) {
this.observers.remove(o);
}
public void notifyAllObserver(Subject s) {
for (Observer o : observers) {
o.update(s);
}
}
public void changeState(String state) {
this.setState(state);
notifyAllObserver(this);
}
}
抽象观察者:
public abstract class Observer {
public Subject s;
public abstract void update(Subject s);
}
观察者1:
public class Observer1 extends Observer{
@Override
public void update(Subject s) {
this.s = s;
System.out.println("观察者1收到消息并给出了反应");
}
}
观察者2:
public class Observer2 extends Observer {
@Override
public void update(Subject s) {
this.s = s;
System.out.println("观察者2收到消息并给出了反应");
}
}
观察者3:
public class Observer3 extends Observer {
@Override
public void update(Subject s) {
this.s = s;
System.out.println("观察者3收到消息并给出了反应");
}
}
Main:
public static void main(String[] args) {
Subject subject = new Subject();
Observer1 o1 = new Observer1();
Observer2 o2 = new Observer2();
Observer3 o3 = new Observer3();
subject.addObserver(o1);
subject.addObserver(o2);
subject.addObserver(o3);
subject.changeState("状态改变");
}
输出:
观察者1收到消息并给出了反应
观察者2收到消息并给出了反应
观察者3收到消息,并给出了反应
讲解:
- 首先是这边的主题类,就是说几个观察者观察什么东西?就是例子中烟花的意思
- 主题类里面有一个列表,记录自己被几个观察者观察,记录了观察者。
- 记录了观察者,之后呢?只要自己状态改变了就通知这里面的观察者们告诉它们我的状态改变了,你们该做出反应了,于是就有了改变状态方法change和notify通知。这个就类似于例子中的未点燃的烟花(初始状态)—>点燃烟花(改变状态)—>烟花绽放的景子映入眼帘(通知)。
- 传递信息的过程:
传递信息给观察者的方式,可以是具体的,比如某一个状态直接传给他们,但是如果是这样的话,要是另外一状态状态2改变了又咋办呢?总不能再写方法把?所以干脆把这个对象传给他们得了,让它们自己根据自己的需要提取相应的状态然后做出反应。 - 观察者:
观察者里面维护一个主题类,意为观察的对象,当某一个时机来临时(被观察者对象状态改变等)将会自己做出响应的反应,也就是例子中的小王,小明,小李。不同的慨叹。