ps:文章来自www.cnblogs.com/fingerboy/p/5468994.html
观察者模式又称发布/订阅模式。 观察者模式定义了对象之间一对多的依赖关系,这样,当“一”的一方状态发生改变时,它所依赖的“多”的一方都会收到通知并自动更新。
这里以老师学生为例:
//主题接口
interface Subject{
//添加观察者
void addObserver(Observer obj);
//删除观察者
void deleteObserver(Observer obj);
//当主题状态改变时,这个方法被调用,通知所有观察者
void notifyObserver();
}
//Observer接口(观察者)
interface Observer{
//当主题状态改变时,会将一个String类型传入改方法,每个观察者都需要实现这个方法
public void update(String info);
}
//老师
public class TeacherSubject implements Subject{
private List<Observer> observerList = new ArrayList<Observer>();
//记录状态的字符串
private String info;
public void addObserver(Observer obj){
observerList.add(obj);
}
public void deleteObserver(Observer obj){
if(observerList.contains(obj)) observerList.remove(obj);
}
public void notifyObserver(){
for(Observer observer: observerList){
observer.update(info);
}
}
//布置作业方法
public void setHomework(String info){
this.info = info;
System.out.println("今日作业----"+info);
this.notifyObserver();
}
}
//学生
public class StudentObserver implements Obsesrver{
//保存一个Subject的引用,方便取消订阅使用
private Subject subject;
private String name;
//构造器用来注册观察者
public StudentObserver(String name,Subject subject){
this.name = name;
this. subject = subject;
//新建学生时,默认让他从老师那里订阅。
subject.addObserver(this);
}
public void update(String info){
System.out.println(name+"----得到作业"+info);
}
}
//测试类
public class Test{
public static void main(String[] args){
Subject teacher = new TeacherSubject();
Observer zhang = new StudentObserver("张",teacher);
Observer wang = new StudentObserver("王",teacher);
Observer li = new StudentObserver("李",teacher);
teacher.setHomeWork("背诵课文");
teacher.setHomeWork("背诵乘法口诀");
teacher.setHomeWork("抄写单词");
//输出 今日作业--背诵课文
//张----得到作业背诵课文
//王----得到作业背诵课文
//李----得到作业背诵课文
// 今日作业--背诵乘法口诀
//。。。。。。。。
}
}
java 内置了观察者模式 在java.util包包含了Observer与Observerable.功能类似Subject与Observer接口
观察者模式好处:
观察者模式提供了一种对象设计,让主题与观察者之间耦合度降低,因为关于观察者的一切,只要指定观察者实现了Observer接口,并不关心观察者具体的类型是谁,有什么功能等其它细节。
网友评论