通过利用java的JDK自带类进行观察者模式的创建
在java中,jdk都帮我们实现好了抽象主题角色和抽象观察者。
我们只需要在上述的内容中创建两个类,
一个是具体的主题角色类继承 java.util.Observable这个类
另一个是具体的观察者角色实现java.util.Observable接口
首先我们创建具体的主题角色类 (在上述例子中的老师Teacher)
package com.whoami.jdk; import java.util.Observable; public class SpecificTeacherSbuject extends Observable { //定义老师通知的内容 private String contex; public String getContex() { return contex; } public void setContex(String contex) { this.contex = contex; //通知观察者,在java实现观察者中,一定要先实现this.setChange(); this.setChanged(); //观察者实现模式的拉模式 //this.notifyObservers(); //观察者实现模式中的推模式,注意两种模式不能同时出现 this.notifyObservers(contex); } }
然后实现具体的观察者对象
package com.whoami.jdk; import java.util.Observable; import java.util.Observer; public class SpecificStudentObserver implements Observer { private String observerName; private String observerThing; //private String contex; public String getObserverName() { return observerName; } public void setObserverName(String observerName) { this.observerName = observerName; } public String getObserverThing() { return observerThing; } public void setObserverThing(String observerThing) { this.observerThing = observerThing; } /** * 使用java jdk中实现的观察者的接口。 update(Observable o, Object arg) 同时定义了推和拉两种方式。可根据选择改变 */ @Override public void update(Observable o, Object arg) { //推模式 System.out.println(observerName+"收到"+arg+"将要:"+observerThing); //拉模式 //contex = ((SpecificTeacherSbuject)o).getContex(); //System.out.println(observerName+"收到"+contex+"将要:"+observerThing); } }
最后我们实现一个测试类
主要有四步:
1.创建具体对象目标
2.创建具体的观察者
3.为对象添加观察者
4.对象更新,通知观察者
package com.whoami.jdk; public class TestMain { /** * 实现java内部observer接口实现观察者的测试类 */ public static void main(String[] args) { //创建一个老师,目标 SpecificTeacherSbuject teacher = new SpecificTeacherSbuject(); //创建观察者学生 SpecificStudentObserver studentOne = new SpecificStudentObserver(); studentOne.setObserverName("小明"); studentOne.setObserverThing("扫教室"); SpecificStudentObserver studentTwo = new SpecificStudentObserver(); studentTwo.setObserverName("小明"); studentTwo.setObserverThing("扫工地"); //注册观察者 teacher.addObserver(studentOne); teacher.addObserver(studentTwo); //目标更新,老师发布通知 teacher.setContex("命令:打扫卫生"); } }