该模式业务逻辑写在观察者模式中的观察者内,当被观察者发生改变时,通知观察者进行更新。
类图:
观察者模式一、自定义实现
1.接口层
- Subject接口:
//被观察者接口
interface Subject {
//添加观察者
void addObserver(Observer obj);
//移除观察者
void deleteObserver(Observer obj);
//当主题方法改变时,这个方法被调用,通知所有的观察者
void notifyObserver();
}
- Observer接口::
//观察者接口
interface Observer {
//当主题状态改变时,会将一个String类型字符传入该方法的参数,每个观察者都需要实现该方法
public void update(String info);
}
2.观察者与被观察者实体类
- Subject接口实现类TeacherSubject:
import java.util.ArrayList;
import java.util.List;
public class TeacherSubject implements Subject {
//用来存放和记录观察者
private List<Observer> observers=new ArrayList<Observer>();
//记录状态的字符串
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 o=(Observer)observers.get(i);
o.update(info);
}
}
//布置作业的方法,在方法最后,需要调用notifyObserver()方法,通知所有观察者更新状态
public void setHomework(String info){
this.info=info;
System.out.println("今天的作业是"+info);
this.notifyObserver();
}
}
- Observer接口实现类StudentObserver:
public class StudentObserver implements Observer {
//保存一个Subject的引用,以后如果可以想取消订阅,有了这个引用会比较方便
private TeacherSubject t;
//学生的姓名,用来标识不同的学生对象
private String name;
//构造器用来注册观察者
public Student(String name,Teacher t) {
this.name=name;
this.t = t;
//每新建一个学生对象,默认添加到观察者的行列
t.addObserver(this);
}
@Override
public void update(String info) {
System.out.println(name+"得到作业:"+info);
}
}
3.测试
测试代码:
public static void main(String[] args) {
TeacherSubject teacher=new TeacherSubject();
StudentObserver zhangSan=new StudentObserver("张三", teacher);
StudentObserver LiSi=new StudentObserver("李四", teacher);
StudentObserver WangWu=new StudentObserver("王五", teacher);
teacher.setHomework("第二页第六题");
teacher.setHomework("第三页第七题");
teacher.setHomework("第五页第八题");
}
测试结果:
测试结果二、java内置的观察者模式
1.被观察者
import java.util.Observable;
/**
* java内置的观察者模式
*/
public class Teacher extends Observable {
private String info;
public void setHomework(String info) {
this.info = info;
System.out.println("布置的作业是" + info);
setChanged();
notifyObservers();
}
public String getInfo() {
return info;
}
}
2.观察者
package com.sqlb.observer;
import java.util.Observable;
import java.util.Observer;
/**
*java内置的观察者模式
*/
public class Student implements Observer {
private Observable ob;
private String name;
public Student(String name,Observable ob) {
this.ob = ob;
this.name=name;
ob.addObserver(this);
}
public void update(Observable o, Object arg) {
Teacher t=(Teacher)o;
System.out.println(name+"得到作业信息:"+t.getInfo());
}
}
3.测试
Teacher teacher=new Teacher();
Student zhangSan=new Student("张三", teacher);
Student LiSi=new Student("李四", teacher);
Student WangWu=new Student("王五", teacher);
teacher.setHomework("第二页第六题");
teacher.setHomework("第三页第七题");
teacher.setHomework("第五页第八题");
结果和上面的一样。
本文参考了这里,如有侵权行为,可直接联系作者及时更正。
网友评论