什么是观察者模式?
百科是这样描述的:观察者模式(有时又被称为发布-订阅模式、模型-视图模式、源-收听者模式或从属者模式).
下面我给出大家我的理解,观察者模式就类似与同学和老师的关系一样。
老师就是被观察的对象,而同学们都是老师的观察者。将这一类比用到课堂上,可以说是更加的容易理解。
例如:
老师是一个被观察的对象,老师在教师里面给同学们上课,老师自然知道这个教室里面有多少个同学以及每个同学的位置或者名字
而每个同学都是老师的一个观察者,当老师讲课的时候,当然所有的同学都能听到。
所以总结来看:老师拥有多个学生,老师可以看到多个学生,每个学生都可以听到老师讲的课。
下面给出大家实现代码,如果大家有什么不懂地方,尽管提出来,我会尽我所能给大家解答的。
TeahcerInterface.java
package com.design.observer;
/**
* @author 鲁志明 E-mail: 13688601037@139.com
* @version 创建时间:2013-5-27 下午9:06:04
*
*/
public interface TeahcerInterface {
// 增加学生
public void add(StudentInterface student);
// 移除学生
public void remove(StudentInterface student);
// 教授知识
public void teachTechnology(String notes);
}
StudentInterface.java
package com.design.observer;
/**
* @author 鲁志明 E-mail: 13688601037@139.com
* @version 创建时间:2013-5-27 下午9:06:25
*
*/
public interface StudentInterface {
// 听课
public void listen(String notes);
}
Teacher.java
package com.design.observer;
import java.util.ArrayList;
import java.util.List;
/**
* @author 鲁志明 E-mail: 13688601037@139.com
* @version 创建时间:2013-5-27 下午9:09:55
*
*/
public class Teacher implements TeahcerInterface {
//保存所有的学生,因为老师可以看到所有的学生,可以给所有的学生上课,即可以给所有的学生通知
private List<StudentInterface> students = new ArrayList<StudentInterface>();
private String teacherName;
public Teacher(String teacherName) {
this.teacherName = teacherName;
}
@Override
public void add(StudentInterface student) {
this.students.add(student);
}
@Override
public void remove(StudentInterface student) {
this.students.remove(student);
}
@Override
// 遍历老师的学生,告诉学生老师上课了
public void teachTechnology(String notes) {
for(StudentInterface student : this.students)
{
// 既然老师上课了,学生就应该听课了
student.listen(this.teacherName+"告诉大家写:"+notes);
student.listen(teacherName+"您好,我是"+((Student)student).getStudentName()+"我已经把笔记:"+"'"+notes+"'"+"写完了");
}
}
}
Student.java
package com.design.observer;
/**
* @author 鲁志明 E-mail: 13688601037@139.com
* @version 创建时间:2013-5-27 下午9:13:32
*
*/
public class Student implements StudentInterface {
private String studentName;
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public Student(String studentName) {
this.studentName = studentName;
}
//听课
@Override
public void listen(String notes) {
System.out.println(notes);
}
}
UseDemo.java
package com.design.observer;
/**
* @author 鲁志明 E-mail: 13688601037@139.com
* @version 创建时间:2013-5-27 下午9:14:10
*
*/
public class UseDemo {
public static void main(String[] args) {
// 生成一个老师
TeahcerInterface teacher = new Teacher("李老师");
// 生成两个学生
StudentInterface student1 = new Student("同学1");
StudentInterface student2 = new Student("同学2");
// 老师要给这连个学生上课
teacher.add(student1);
teacher.add(student2);
// 老师开始上课
teacher.teachTechnology("请大家记录笔记");
}
}