观察者模式
定义
定义对象的一种一对多的依赖关系,所有依赖它的对象会自动更新数据,及在被观察的对象发生改变时,主动告知它的观察者们,更新相应的数据信息,并且是一种松耦合的状态。
图解(UML图网上一大堆这里就放个我自己画的)
java代码
接口
/**
* 观察者接口
* 给予观察者的一个定义
* @author xiaokun
*/
public interface IObserver {
//观察者接受信息
public void get(String msg);
}
/**
* 被观察者接口
* 被观察对象的接口定义
* @author xiaokun
*/
public interface IObject {
//需要注册成为观察者的人
public void register(IObserver iob);
//注销模式未在代码中体现
//通知所有在观察的人,有新的动态了
public void notifyObserver(String msg);
}
实现类
/**
* 老师 是被观察的对象
* 如果老师布置作业,考试通知会告知观察者们
* 方法说明在接口类
* @author xiaokun
*/
public class Teacher implements IObject{
private List<IObserver> obs = new ArrayList<>();
@Override
public void register(IObserver iob) {
obs.add(iob);
}
@Override
public void notifyObserver(String msg) {
//下面为所需要通知的逻辑代码,所需要通知的信息可以当做参数传进来
for(IObserver s:obs) {
s.get("老师说"+msg);
}
}
}
/**
* 观察者
* 学生家长也作为一个观察者关注老师
* 方法说明在接口类
* @author xiaokun
*/
public class Parent implements IObserver{
private String message;
public Parent(String message) {
this.message = message;
}
public String getMessage() {
return "我是家长:"+message;
}
@Override
public void get(String msg) {
this.message = msg;
}
}
/**
* 观察者
* 学生观察老师,即获取知识和任务
* 方法说明在接口类
* @author xiaokun
*/
public class Student implements IObserver {
private String id;
private String message;
public Student(String id,String message) {
this.id = id;
this.message = message;
}
public String getMessage() {
return "我是学生"+id+":"+message;
}
@Override
public void get(String msg) {
this.message = msg;
}
}
测试类
public class Test {
public static void main(String[] args) {
Teacher teacher = new Teacher();
Parent parent = new Parent("我在等待老师发来的信息!");
Student student1 = new Student("007","我在等待老师发来的信息!");
Student student2 = new Student("666","我在等待老师发来的信息!");
System.out.println(parent.getMessage());
System.out.println(student1.getMessage());
System.out.println(student2.getMessage());
//---------------注册成为观察者----------------
teacher.register(parent);
teacher.register(student1);
teacher.register(student2);
//---------------注册成为观察者----------------
System.out.println("-----------开始通知--------------");
teacher.notifyObserver("明天放假"); //-------------通知开始
System.out.println(parent.getMessage());
System.out.println(student1.getMessage());
System.out.println(student2.getMessage());
}
}
输出测试结果
我是家长:我在等待老师发来的信息!
我是学生007:我在等待老师发来的信息!
我是学生666:我在等待老师发来的信息!
-----------开始通知--------------
我是家长:老师说明天放假
我是学生007:老师说明天放假
我是学生666:老师说明天放假