java 面向对象经典例题——教师,学生,家长。教师布置作业给学生和家长。

题目:

教师,学生,家长。教师布置作业给学生和家长。每当教师布置一个道题时,就要自动通知到所有的学生和家长把该题记下来,然后在布置下一道题。要求程序扩展性,新学生或者家长可以随时加入这个班级,可以随时转学取消作业通知。(提示:模拟天气预报的案例,使用观察者模型)


运行结果:
运行结果
注:以下函数每一块都是一个独立的类,共有六个类

接口的运用以及观察者模型的运用

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函数

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值