观察者模式其实就是一句话——一旦发现xxx,就xxx。
比如一旦发现老师来,就假装好好学习。
比如一旦发现老板来,就停止闲聊。
比如一旦发现某服务启动,就执行某段代码。
再比如各种框架中的监听器,都是观察者模式。
首先,定义观察者和通知者的接口约束:
package interfaze;
/**
* 观察者接口定义
* @author lxp
*
*/
public interface IObserver {
/**
* 观察者做出反应
* @param status 突发事件通知
*/
void react(String status);
}
package interfaze;
import java.util.ArrayList;
import java.util.List;
/**
* 通知者接口定义
* @author lxp
*
*/
public interface ISubject {
/**
* 通知诸位观察者
*/
void notifyObs();
/**
* 注册观察者
* @param observer 观察者
*/
void addObserver(IObserver observer);
}
然后,定义观察者和通知者都会有的一些信息(该步骤可省略):
package superclazz;
/**
* 观察者父类,主要是所有观察者的共同属性。
* @author lxp
*
*/
public class ObserverSuper {
// 观察者姓名等信息
protected String name = "";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package superclazz;
import java.util.ArrayList;
import java.util.List;
import interfaze.IObserver;
/**
* 通知者父类,主要是所有通知者的共同属性。
* @author lxp
*
*/
public class SubjectSuper {
/**
* 突发情况
*/
protected String status = "";
/**
* 通知者姓名
*/
protected String name = "";
/**
* 存储一系列的观察者
*/
List observerList = new ArrayList<IObserver>();
/**
* 添加观察者
* @param employee 观察者
*/
public void addObserver(IObserver employee) {
this.getObserverList().add(employee);
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public List getObserverList() {
return observerList;
}
public void setObserverList(List observerList) {
this.observerList = observerList;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
接下来,写观察者(员工和学生)和通知者(老板和老师)的实现类:
package implement;
import interfaze.IObserver;
import superclazz.ObserverSuper;
/**
* 雇员类
*
* @author lxp
*
*/
public class Employee extends ObserverSuper implements IObserver {
public Employee(String empName) {
this.setName(empName);
}
/**
* 观察者做出反应
*
* @param status
* 突发事件通知
*/
@Override
public void react(String status) {
System.out.println(status + "我" + this.getName() + "得赶紧工作");
}
}
package implement;
import interfaze.IObserver;
import superclazz.ObserverSuper;
/**
* 学生类
*
* @author lxp
*
*/
public class Student extends ObserverSuper implements IObserver {
public Student(String studentName) {
this.setName(studentName);
}
/**
* 观察者做出反应
*
* @param status
* 突发事件通知
*/
@Override
public void react(String status) {
System.out.println(status + "我" + this.getName() + "得赶紧学习");
}
}
package implement;
import interfaze.IObserver;
import interfaze.ISubject;
import superclazz.SubjectSuper;
/**
* 老板类
* @author lxp
*
*/
public class Boss extends SubjectSuper implements ISubject {
public Boss(String bossName) {
this.setName(bossName);
}
/**
* 通知诸位观察者
*/
@Override
public void notifyObs() {
for ( int i =0 ;i<this.getObserverList().size();i++){
((IObserver)this.getObserverList().get(i)).react(this.getStatus());
}
}
/**
* 覆盖父类方法,一旦状态发生改变,立即通知观察者们。
*/
public void setStatus(String status) {
this.status = status;
this.notifyObs();
}
}
package implement;
import interfaze.IObserver;
import interfaze.ISubject;
import superclazz.SubjectSuper;
/**
* 老师类
* @author lxp
*
*/
public class Teacher extends SubjectSuper implements ISubject {
public Teacher(String teacherName) {
this.setName(teacherName);
}
/**
* 通知诸位观察者
*/
@Override
public void notifyObs() {
for ( int i =0 ;i<this.getObserverList().size();i++){
((IObserver)this.getObserverList().get(i)).react(this.getStatus());
}
}
/**
* 覆盖父类方法,一旦状态发生改变,立即通知观察者们。
*/
public void setStatus(String status) {
this.status = status;
this.notifyObs();
}
}
最后,上测试程序:
package test;
import implement.Boss;
import implement.Employee;
import implement.Student;
import implement.Teacher;
import interfaze.IObserver;
import interfaze.ISubject;
import superclazz.SubjectSuper;
public class Test {
public static void main(String[] args) {
// 这些是赵老的老板的员工们
IObserver employee1 = new Employee("张老三");
IObserver employee2 = new Employee("李老四");
IObserver employee3 = new Employee("王老五");
IObserver employee4 = new Employee("赵老六");
// 注册赵老大为通知者
SubjectSuper boss = new Boss("赵老大");
boss.addObserver(employee1);
boss.addObserver(employee2);
boss.addObserver(employee3);
boss.addObserver(employee4);
// 一旦赵老大回来了,员工们就赶紧停止偷懒好好干活儿。
boss.setStatus("赵老大来了");
// 这是刘老师的学生们
IObserver student1 = new Student("张三");
IObserver student2 = new Student("李四");
IObserver student3 = new Student("王五");
IObserver student4 = new Student("赵六");
// 注册刘老师为通知者
SubjectSuper teacher = new Teacher("刘老师");
teacher.addObserver(student1);
teacher.addObserver(student2);
teacher.addObserver(student3);
teacher.addObserver(student4);
// 一旦刘老师回来了,同学恩就赶紧停止交头接耳好好学习。
teacher.setStatus("刘老师来了");
}
}
===========本人用java写的观察者模式的小demo,源码里有详细的注释,保证一看就懂。欢迎大牛指点。======================
=========================================转载请注明出处,谢谢啦^_^=========================================