观察者模式
意图是在多个对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,会通知依赖于它的对象,并根据新状态做出相应的反应。
也就是当一个对象发生改变是,通知调用它的对象。
package website.dengta.observer;
/**
* @author www.dengta.website
* @date 2017-10-23 22:58
*/
public interface Subject {
public void addObserver(Observer obj);
public void deleteObserver(Observer obj);
//通知所有的观察者
public void notifyObserver();
}
package website.dengta.observer;
import java.util.ArrayList;
import java.util.List;
/**
* @author www.dengta.website
* @date 2017-10-23 23:02
*/
public class TeacherSubjcet implements Subject {
//用来记录和存放观察者
private List<Observer> observers = new ArrayList<>();
//记录状态的字符串
private String info;
@Override
public void addObserver(Observer obj) {
observers.add(obj);
}
@Override
public void deleteObserver(Observer obj) {
int i = observers.indexOf(obj);
if (i>0) observers.remove(obj);
}
@Override
public void notifyObserver() {
for (int i = 0; i < observers.size(); i++) {
Observer observer = observers.get(i);
observer.update(info);
}
}
//布置作业的方法,在方法的最后,需要调用notifyObserver()方法,通知所有观察者更新状态
public void setHomeWork(String info){
this.info = info;
System.out.println("老师,今天布置作业了.");
this.notifyObserver();
}
}
package website.dengta.observer;
public interface Observer {
public void update(String info);
}
package website.dengta.observer;
/**
* @author www.dengta.website
* @date 2017-10-23 23:10
*/
public class StudentObserver implements Observer {
//保存一个Subject的引用,以后如果可以想取消订阅,有了这个引用会比较方便
private TeacherSubjcet t;
//学生的姓名,用来标识不同的学生对象
private String name;
//构造器用来注册观察者
public StudentObserver(String name,TeacherSubjcet t) {
this.name=name;
this.t = t;
//每新建一个学生对象,默认添加到观察者的行列
t.addObserver(this);
}
@Override
public void update(String info) {
System.out.println(name+"得到作业:"+info);
}
}
package website.dengta.observer;
/**
* @author www.dengta.website
* @date 2017-10-23 23:13
*/
public class TestObserver {
public static void main(String[] args) {
TeacherSubjcet teacher=new TeacherSubjcet();
StudentObserver zhangSan=new StudentObserver("张三", teacher);
StudentObserver LiSi=new StudentObserver("李四", teacher);
StudentObserver WangWu=new StudentObserver("王五", teacher);
teacher.setHomeWork("第二页第六题");
teacher.setHomeWork("第三页第七题");
teacher.setHomeWork("第五页第八题");
}
}
最后打印数据:
老师,今天布置作业了.
张三得到作业:第二页第六题
李四得到作业:第二页第六题
王五得到作业:第二页第六题
老师,今天布置作业了.
张三得到作业:第三页第七题
李四得到作业:第三页第七题
王五得到作业:第三页第七题
老师,今天布置作业了.
张三得到作业:第五页第八题
李四得到作业:第五页第八题
王五得到作业:第五页第八题
小结:
在观察者模式中,观察另外一个对象状态的对象叫做Observer观察者,被观察的对象叫着Subject被观察者。
Subject(被观察者)包含了一些需要在其状态改变时通知的观察者。因此,他应该提供给观察者可以register(注册)自己和unregister(注销)自己的方法。当Subject(被观察者)发生变化的时候,也需要包含一个方法来通知所有观察者。当通知观察者的时候,可以推送更新内容,或者提供另外一个方法来获得更新内容。
观察者应该有一种方法,这种方法能够设置观察者对象并且可以由被观察者使用来通知其更新。如update()方法