标签:
先把观察者模式文绉绉的定义搬上来,观察者模式:定义了对象之间的一对多的以来,当一个对象状态改变 时,他的所有依赖者都会收到通知并且自动更新.
其实定义说的也并不是那么文绉绉,下面我们来举一个例子:对于一个班来说,有若干个学生,一个班主任.只要有通知的时候,班主任会给每个学生发送飞信来通知大家.当有 一个孩子想加入这个班的时候他只需告诉班主任来注册就可以加入这个班.当他加入这个班以后呢,这个班有什么通知的话他也会收到班主任发的飞信.当有某个同学不想呆在这里转班了,他会通知班主任把自己移除,以后班级里的通知他便收不到了.班主任与学生的关系如下图所示:
其实,这就是观察者模式,学生相当于观察者,只要老师这边一有什么通知(发生改变),然后作为观察者的学生便会知悉,并作出处理.因此:主题+观察者=观察者模式.
我们要实现观察者能通过主题的接口注册和移除,主题能通过观察者的接口接收通知.他们之间的关系为:
首先,定义主题的接口:
package com.john; public interface Subject { public void addObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers(); }然后,定义我们的观察者接口:
package com.john; public interface Observer { public void update(String message); }然后接下来就是定义我们的老师类:
package com.john; import java.util.ArrayList; public class Teacher implements Subject { private ArrayList<Observer> observers; private String message; public Teacher(){ observers = new ArrayList<Observer>(); } public void addObserver(Observer o) { observers.add(o); } public void removeObserver(Observer o) { int i = observers.indexOf(o); if(i > 0){ observers.remove(i); } } public void notifyObservers() { for (Observer o : observers) { o.update(message); } } public void ReceiveMessage(String message){ this.message = message; notifyObservers();//接受到新的通知,通知所有学生 } }然后定义我们的学生类:
package com.john; public class Student implements Observer { private String name; private String message; public Student(String name,Teacher t){ this.name = name; t.addObserver(this); } public void update(String message) { this.message = message; processmessage(); } public void processmessage(){ System.out.println("学生"+name+"收到通知."+message); } }最后,来一个主函数查看我们的学生是否能实时收到老师发送的消息呢?
package com.john; public class Main { public static void main(String args[]){ Teacher teacher = new Teacher(); Student xiaoming = new Student("小明",teacher); Student xiaohua = new Student("小华",teacher); Student xiaohong = new Student("小红",teacher); teacher.ReceiveMessage("今天的作业是抄一遍课文"); teacher.ReceiveMessage("明天不用来上学了"); } }看一看我们的运行结果:
通过我们的运行结果,我们可以看到,只要老是发送消息,我们的学生就能够实时的收到.
观察者模式中,当主题有新的变化的时候,观察者可以随时接收到自身并对接受的信息加以处理.
标签:
原文地址:http://blog.csdn.net/u011918771/article/details/44459099