观察者模式:
(1)
基本概念:
观察者模式属于行为型模式,其意图是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
这一个模式的关键对象是目标(Subject)和观察者(Observer)。一个目标可以有任意数目的依赖它的观察者,一旦目标的状态发生改变,所有的观察者都得到通知,作为对这个通知的响应,每个观察者都将查询目标以使其状态与目标的状态同步。
适用场景:
观察者模式,用于存在一对多依赖关系的对象间,当被依赖者变化时,通知依赖者全部进行更新。因此,被依赖者,应该有添加/删除依赖者的方法,且可以将添加的依赖者放到一个容器中;且有一个方法去通知依赖者进行更新。
(2)
思想:
(一)
建立目标(subject)与观察者(observer)接口:
目标(subject)接口:
建立一个注册观察者对象的接口; public void attach(Observer o);
建立一个删除观察者对象的接口; public void detach(Observer o);
建立一个当目标状态发生改变时,发布通知给观察者对象的接口; public void notice();
观察者(observer)接口:
建立一个当收到目标通知后的更新接口: public void update();
(3)
实例:
老师又电话号码,学生需要知道老师的电话号码以便于在合时的时候拨打,在这样的组合中,老师就是一个被观察者
(Subject),学生就是需要知道信息的观察者,当老师的电话号码发生改变时,学生得到通知,并更新相应的电话记
录。
import java.util.*; interface Subject { public void attach(Observer o);//注册观察者对象的接口 public void detach(Observer o);//删除观察者对象的接口 public void notice();//通知观察者对象 } interface Observer { public void update();//收到通知后更新 } public class Teacher implements Subject{ private String phone; private Vector students; public Teacher() { phone = ""; students = new Vector(); } @Override public void attach(Observer o) { students.add(o); } @Override public void detach(Observer o) { students.remove(o); } @Override public void notice() { for(int i=0;i<students.size();i++) ((Observer)students.get(i)).update(); } public void setPhone(String phone) { this.phone=phone; notice();//关键? } public String getPhone() { return phone; } } class Students implements Observer { private String name; private String phone; private Teacher teacher; public Students(String name,Teacher teacher) { this.name=name; this.teacher=teacher; } public void update() { phone = teacher.getPhone(); } public void show() { System.out.println("Name:"+name+"\n Teacher's phone:"+phone); } }
import java.util.*; public class Client { public static void main(String[] args) { // TODO Auto-generated method stub Vector students = new Vector(); Teacher teacher = new Teacher(); for(int i=0;i<10;i++) { Students st = new Students("洁初"+i,teacher); students.add(st); teacher.attach(st); //teacher.detach(st); } teacher.setPhone("12354679"); for(int i=0;i<students.size();i++) { ((Students)students.get(i)).show(); } teacher.setPhone("15218954693"); for(int i=0;i<students.size();i++) { ((Students)students.get(i)).show(); } } }
/*
* 总结:Observer模式的最知名的应用是
* 在MVC结构,Observer模式可以很好的应用在
* 文档和图表程序的制作中。
*/
本文借鉴了其他博客的内容:地址是https://www.cnblogs.com/hnrainll/archive/2011/12/29/2305582.html
浙公网安备 33010602011771号