您的位置:首页 > 编程语言 > Java开发

java 观察者模式

2015-08-18 17:54 633 查看
观察者模式顾名思义就是观察一个对象的变化并且做相应的动作。

举个例子:

一个学生可以有学习,睡觉的动作,但是如果在他做这些事情之前他妈妈提醒他下面该作甚么。一旦他学习,就提醒他要先预习课程,一旦他睡觉就提醒他要先洗脚。

我们来先定义一个学生实体:

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:学习
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: