观察者模式顾名思义就是观察一个对象的变化并且做相应的动作。
举个例子:
一个学生可以有学习,睡觉的动作,但是如果在他做这些事情之前他妈妈提醒他下面该作甚么。一旦他学习,就提醒他要先预习课程,一旦他睡觉就提醒他要先洗脚。
我们来先定义一个学生实体:
public class Student {
//学生名
private String name;
private StudentListener listener;
public String getName() {
return name;
}
public Student(String name){
this.name=name;
}
public void study(){
//先看看有没有在监视你,如果有的话,就会提醒你睡觉前作甚么
if (this.listener!=null) {
this.listener.preStudy(new StudentEvnet(this));
}
System.out.println(name+":学习");
}
public void sleep(){
//先看看有没有在监视你,如果有的话,就会提醒你睡觉前作甚么
if (this.listener!=null) {
this.listener.preSleep(new StudentEvnet(this));
}
System.out.println(name+":睡觉");
}
//申请我要被妈妈监视的入口
public void addStudentListener(StudentListener listener){
this.listener=listener;
}
}
定义一下监视的事件源也就是被监视者:
public class StudentEvnet {
private Object source;
public StudentEvnet(Object source) {
this.source = source;
}
public Object getSource() {
return this.source;
}
}
定义一下监视后的动作:
public interface StudentListener {
void preStudy(StudentEvnet e);
void preSleep(StudentEvnet e);
}
有了这些我们就可以具体实现:
public class Main {
public static void main(String[] args) {
Student st = new Student("dsp");
st.addStudentListener(new StudentListener() {
public void preStudy(StudentEvnet e) {
// TODO Auto-generated method stub
Student st = (Student) e.getSource();
System.out.println(st.getName() + ":学习前先看书");
}
public void preSleep(StudentEvnet e) {
Student st = (Student) e.getSource();
System.out.println(st.getName() + ":学习前先洗脚");
}
});
st.sleep();
st.study();
}
}
运行结果:
dsp:睡觉前先洗脚dsp:睡觉
dsp:学习前先看书
dsp:学习