文章目录
我们身边的观察者模式
在我们日常生活中,随处有观察者模式的身影,例如我们自习的时候在班级里看电影,有一位同学在看老师来了没,而这位同学就是观察者,老师就是被观察者。从这个简单的例子我们可以看出,观察者模式中,要有观察者和被观察者。其中被观察者需要有一个具体的实现,例如老师来了(可以理解为是一个动作),同时观察者也有实现,例如看到老师来了,把电影关了。
观察者模式的角色
一般情况下,观察者模式要有四个角色,分别是Subject(主题,即被观察者)ConcreteSubject(具体主题),Observe(观察者)ConcreteObserve(具体观察者)
代码说明观察者模式
首先我们需要有一个观察者,他负责看老师来了没
public interface StudentObserve {
void seeTeacher();
}
然后有一个观察者的实现,也就是,当老师来了,我需要做出相应的动作
public class StudentObserveImpl implements StudentObserve {
@Override
public void seeTeacher() {
System.out.println("老师来了,全体隐蔽!!!");
}
}
好了,我们还需要有一个Subject接口,也就是被观察者,被观察者至少需要三个功能,添加观察者,删除观察者,通知观察者
public interface TeacherObject {
void addObserve(StudentObserve studentObserve);
void removeObserve(StudentObserve studentObserve);
void notifyObserve();
}
另外,我们需要一个被观察者的实现,也就是来看看同学们都在干什么,其中list数组是用来存储观察者的,也就是有多少个人订阅了这个主题。
public class TeacherObjectImpl implements TeacherObject {
List<StudentObserve> list = new ArrayList();
@Override
public void addObserve(StudentObserve studentObserve) {
list.add(studentObserve);
}
@Override
public void removeObserve(StudentObserve studentObserve) {
list.remove(studentObserve);
}
@Override
public void notifyObserve() {
list.forEach(studentObserve -> {
studentObserve.seeTeacher();
});
}
/**
* 老师来班级了
*/
public void comeClass() {
// 此处省略具体业务
notifyObserve();
}
}
下面我们可以测试了
public class Main {
public static void main(String[] args) {
TeacherObjectImpl teacherObject = new TeacherObjectImpl();
StudentObserve studentObserve = new StudentObserveImpl();
// 学生观察老师
teacherObject.addObserve(studentObserve);
// 老师来班级
teacherObject.comeClass();
}
}
可以看出,当老师来班级的时候,把风的就发出通知
好了,至此简单的观察者模式就实现了。