之前使用观察者模式写代码的时候总要写很多东西,包括在被观察者那里设置数组储存所有的观察者然后还要写提醒所有观察者的方法,这些代码都很繁琐,并且如果你的代码里面有很多重复的代码,好在Java帮我们准备了 Observer 接口和 Observable 类,我们可以直接使用它们完成上面所有的事,既节省了我们的时间,同时也帮助我们日后阅读代码。
用一个例子来时用这两个类吧
我们这里定义两个类,一个是 Teacher 类,另一个是 Student 类,我们想要做的是,当老师说出了她的名字以后,所有的人都喊出 ” XX 老师你好,我的名字叫 XX“,显然在这个例子当中,老师是被观察者,学生是观察者,老师的介绍方法被调用以后,所有学生的介绍方法也要被调用,这里面自然是被观察者去观察观察者,如果这部分不知道的同学,可以去看看设计模式。接下来我们分别展示这两个类。
Teacher 类的代码如下:
public class Teacher extends Observable {
private String name;
public Teacher(String name) {
this.name = name;
}
public void introduce() {
System.out.println("我是" + name + "老师");
super.setChanged();
super.notifyObservers(name);
}
}
Student类的代码如下:
public class Student implements Observer {
private String name;
public Student(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
introduce((String)arg);
}
public void introduce(String teacherName) {
System.out.println(teacherName + "老师你好," + "我的名字叫" + name);
}
}
我们来重点分析一下这两个类,在 Teacher 类里面,作为一个被观察者,他最重要的事就是通知观察者,想要通知观察者就需要调用父类的两个方法,方法如下:
super.setChanged();
super.notifyObservers(name);
setChanged 以后表示有更新,接着去通知所有观察者。
具体调用它们的例子如下:
public class Demo {
public static void main(String[] args) {
Teacher tony = new Teacher("Tony");
Student studentA = new Student("A");
Student studentB = new Student("B");
Student studentC = new Student("C");
tony.addObserver(studentA);
tony.addObserver(studentB);
tony.addObserver(studentC);
tony.introduce();
}
}
如下面所示的分别实例化了观察者和被观察者,然后再被观察者那里注册所有的观察者,随后调用被观察者的方法通知所有的观察者。
结果如下:
我是Tony老师
Tony老师你好,我的名字叫C
Tony老师你好,我的名字叫B
Tony老师你好,我的名字叫A
......
网友评论