题目:
教师,学生,家长。教师布置作业给学生和家长。每当教师布置一个道题时,就要自动通知到所有的学生和家长把该题记下来,然后在布置下一道题。要求程序扩展性,新学生或者家长可以随时加入这个班级,可以随时转学取消作业通知。(提示:模拟天气预报的案例,使用观察者模型)
运行结果:
注:以下函数每一块都是一个独立的类,共有六个类
接口的运用以及观察者模型的运用
package TeaStuPar;//包名
public interface Subject {
public abstract void registerObserver(Observer ob);//注册表
public abstract void removeObserver(Observer ob);//移除语句
public abstract void notifyObserver();//通知
}
package TeaStuPar;//包名
public interface Observer {
//页数和题数
public abstract void update(String page,String num);
}
**这个是主体函数**
package TeaStuPar;//包名
//主体函数
import java.util.ArrayList;//引用java类库
public class TeacherObject implements Subject{
private String page;
private String num;
private ArrayList<Observer> list;//声明一个随机数组,用来装观察者
//构造方法
public TeacherObject() {
list = new ArrayList<Observer>();//数组实例化
}
//set,get方法
public String getPage() {
return page;
}
public String getNum() {
return num;
}
public void setMeasurement(String page,String num) {
this.page=page;
this.num=num;
System.out.println("今天的作业是"+"第"+page+"页"+"第"+num+"题");
notifyObserver();
}
@Override
public void registerObserver(Observer ob) {
// 向数组中添加一个观察者模版
list.add(ob);
}
@Override
public void removeObserver(Observer ob) {
// 删除数组中的观察者模版
if(!list.isEmpty()) {
//如果数组不为空,就删除(若是空的话,没东西可删啊)
boolean flag=list.remove(ob);
if(!flag) {
System.out.println("删除失败!!");
}
}
}
@Override
public void notifyObserver() {
// 这个函数是通知函数
for(Observer observer:list) {
//通过数组中所有的观察者模型,调用观察者模型
observer.update(page, num);
}
}
}
package TeaStuPar;
//观察者模型
public class StudentObserver implements Observer{
private String name;
private String page;
private String num;
private Subject sub;//重要:主题,类和类之间的通信,当一个类想用另一个类,他们之间一定要有一个通信
//构造方法
public StudentObserver(Subject sub,String name) {
this.name=name;
this.sub=sub;
sub.registerObserver(this);//重要:this是当前类的对象,向主体中添加当前类(观察者)的对象
}
@Override
public void update(String page, String num) {
// TODO Auto-generated method stub
this.page=page;
this.num=num;
show();//调用输出函数
}
private void show() {
// 输出函数
System.out.println("学生"+name+"得到的作业:"+"第"+page+"页,"+"第"+num+"题");
}
}
package TeaStuPar;
//观察者模型
public class ParentObserver implements Observer{
private String name;
private String page;
private String num;
private Subject sub;//主题,类和类之间的通信,当一个类想用另一个类,他们之间一定要有一个通信
//构造方法
public ParentObserver(Subject sub,String name) {
this.name=name;
this.sub=sub;
sub.registerObserver(this);
}
@Override
public void update(String page, String num) {
// TODO Auto-generated method stub
this.page=page;
this.num=num;
show();
}
private void show() {
// TODO Auto-generated method stub
System.out.println("学生"+name+"得到的作业:"+"第"+page+"页,"+"第"+num+"题");
}
}
**运行类**
package TeaStuPar;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
TeacherObject tea = new TeacherObject();//实例化主体方法
StudentObserver sub = new StudentObserver(tea,"张三");
StudentObserver sub1 = new StudentObserver(tea,"李四");
StudentObserver sub2 = new StudentObserver(tea,"王五");
ParentObserver par= new ParentObserver(tea,"张大三");
ParentObserver par1= new ParentObserver(tea,"李大四");
ParentObserver par2= new ParentObserver(tea,"王大五");
tea.setMeasurement("二","六");
tea.setMeasurement("三","七");
tea.setMeasurement("五","八");
}
}
1.观察者将引用放入可变数组中,之后主体调用update函数来操作观察者模版
注:观察者只是模板,所有的操作都是主体函数来做,通过增强for使所有观察者模板调用update函数