内容简介:这就好比一个办在线教育的老师(OnlineTeacher)和线下的若干学生(localStudent1, localStudent2, localStudent3 ...)之间的关系。当这个老师在线上发布了一条消息之后,他所有的学生都会收到通知,并可以根据这条消息的内容来实现对应的更新。
观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
这就好比一个办在线教育的老师(OnlineTeacher)和线下的若干学生(localStudent1, localStudent2, localStudent3 ...)之间的关系。
当这个老师在线上发布了一条消息之后,他所有的学生都会收到通知,并可以根据这条消息的内容来实现对应的更新。
观察者模式类图
为了实现 松耦合 设计,OnlineTeacher对象只需要实现 Subject 接口,并实现其中规定的三个方法即可:
- registerObserver(); //注册观察者
- removeObserver(); //取消注册观察者
- notifyObserver(); //通知观察者
Subject接口:
public interface Subject {
//Subject接口中的三个方法,用于注册、移除和通知observers
void registerObserver(Observer observer);
void removeObserver(Observer observer);
//以上两个方法都需要一个observer对象作为变量,以实现注册或被删除
void notifyObservers();
}
同时,OnlineTeacher对象还需要一个数据结构,来存储已经注册的学生对象。
OnlineTeacher类
public class OnlineTeacher implements Subject {
//建立一个数据结构来存储注册过的observer对象
private ArrayList<Observer> observerArrayList;
//用message来模拟老师讲课
private String message;
//OnlineTeacher类的构造器,生成该对象时,会初始化一个observerArrayList
public OnlineTeacher() {
observerArrayList = new ArrayList<>();
}
@Override
public void registerObserver(Observer observer) {
observerArrayList.add(observer);
}
@Override
public void removeObserver(Observer observer) {
int i = observerArrayList.indexOf(observer);
if (i > 0) {
observerArrayList.remove(i);
}
}
//实现notifyObservers(),实质上就是遍历observerArrayList,让其中的每一个observer对象调用他们的update()方法
@Override
public void notifyObservers() {
for (int i = 0; i < observerArrayList.size(); i++) {
observerArrayList.get(i).updates(message);
}
}
//OnlineTeacher有一个方法,setMessage()
public void setMessage(String newMessage) {
this.message = newMessage;
messageChanged(); //message赋值之后,调用messageChanged()方法
}
//还有一个方法,messageChanged,在此方法中调用notifyObservers()
public void messageChanged() {
notifyObservers();
}
}
而所有的学生对象只需要实现 Observer 接口即可成为“观察者”。
所有的观察者只需要保有一个OnlineTeacher对象的引用,便可以在各自的构造器中实现对自身的注册。
Observer接口
public interface Observer {
void updates(String message);
}
用来模拟的localStudent对象们
localStudent1类:
public class LocalStudent1 implements Observer {
private Subject onlineTeacher;
//构造器需要OnlineTeacher对象(也就是subject),用来注册自己
public LocalStudent1(Subject onlineTeacher) {
this.onlineTeacher = onlineTeacher;
onlineTeacher.registerObserver(this);
}
@Override
public void updates(String message) {
System.out.println("localStudent1从onlineTeacher那儿得到的message是:" +
message +','+
"我领悟到的是:女子和小人一样");
}
}
localStudent2类:
public class LocalStudent2 implements Observer {
private Subject onlineTeacher;
public LocalStudent2(Subject onlineTeacher) {
this.onlineTeacher = onlineTeacher;
onlineTeacher.registerObserver(this);
}
@Override
public void updates(String message) {
System.out.println("localStudent2从onlineTeacher那儿得到的message是:" +
message +','+
"我领悟到的是:这话还有后半句——近之则不逊,远之则怨");
}
}
localStudent3类:
public class LocalStudent3 implements Observer{
private Subject onlineTeacher;
public LocalStudent3(Subject onlineTeacher) {
this.onlineTeacher = onlineTeacher;
onlineTeacher.registerObserver(this);
}
@Override
public void updates(String message) {
System.out.println("localStudent3从onlineTeacher那儿得到的message是:" +
message +','+
"我领悟到的是:一个人对他亲近了,他对你不尊重,疏远了却又有怨言!");
}
}
运行 ObserverPatternRunDemo.java
public class ObserverPatternRunDemo {
public static void main (String [] args){
OnlineTeacher onlineTeacher = new OnlineTeacher();
LocalStudent1 localStudent1 = new LocalStudent1(onlineTeacher);
LocalStudent2 localStudent2 = new LocalStudent2(onlineTeacher);
LocalStudent3 localStudent3 = new LocalStudent3(onlineTeacher);
onlineTeacher.setMessage("子曰:唯女子与小人难养也");
}
}
运行时,以localStudent1对象为例。生成该对象时,会调用onlineTeacher对象的 registerObserver()方法 ,将其自身加入到onlineTeacher对象的 observerArrayList 当中。
当onlineTeacher对象调用 setMessage("子曰:唯女子与小人难养也"); 时,相当于 message 的值为 子曰:唯女子与小人难养也 。
//OnlineTeacher.java中定义的setMessage()和messageChanged()方法
...
//OnlineTeacher有一个方法,setMessage()
public void setMessage(String newMessage) {
this.message = newMessage;
messageChanged(); //message赋值之后,调用messageChanged()方法
}
//还有一个方法,messageChanged,在此方法中调用notifyObservers()
public void messageChanged() {
notifyObservers();
}
}
...
根据 onlineTeacher 类中定义的方法,应有:
先调用 messageChanged()方法 ,然后会调用 notifyObservers()方法 ,而 notifyObservers() 方法会遍历所有的Observer对象,并调用他们的 update()方法 :
//实现notifyObservers(),实质上就是遍历observerArrayList,让其中的每一个observer对象调用他们的update()方法
@Override
public void notifyObservers() {
for (int i = 0; i < observerArrayList.size(); i++) {
observerArrayList.get(i).updates(message);
}
}
3个localStudent对象的 update()方法 :
localStudent1.update();
@Override
public void updates(String message) {
System.out.println("localStudent1从onlineTeacher那儿得到的message是:" +
message +','+
"我领悟到的是:女子和小人一样");
}
}
localStudent2.update();
@Override
public void updates(String message) {
System.out.println("localStudent2从onlineTeacher那儿得到的message是:" +
message +','+
"我领悟到的是:这话还有后半句——近之则不逊,远之则怨");
}
**localStudent3.update();**
@Override
public void updates(String message) {
System.out.println("localStudent3从onlineTeacher那儿得到的message是:" +
message +','+
"我领悟到的是:一个人对他亲近了,他对你不尊重,疏远了却又有怨言!");
}
Demo运行的结果
localStudent1从onlineTeacher那儿得到的message是:子曰:唯女子与小人难养也,我领悟到的是:女子和小人一样 localStudent2从onlineTeacher那儿得到的message是:子曰:唯女子与小人难养也,我领悟到的是:这话还有后半句——近之则不逊,远之则怨 localStudent3从onlineTeacher那儿得到的message是:子曰:唯女子与小人难养也,我领悟到的是:一个人对他亲近了,他对你不尊重,疏远了却又有怨言!
以上所述就是小编给大家介绍的《观察者模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Hit Refresh
Satya Nadella、Greg Shaw / HarperBusiness / 2017-9-26 / USD 20.37
Hit Refresh is about individual change, about the transformation happening inside of Microsoft and the technology that will soon impact all of our lives—the arrival of the most exciting and disruptive......一起来看看 《Hit Refresh》 这本书的介绍吧!