首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

java惯用设计模式之观察者模式

2012-10-09 
java常用设计模式之观察者模式-------------------------------- 观察者模式(Observer) -----------------

java常用设计模式之观察者模式
-------------------------------- 观察者模式(Observer) --------------------------------
(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),学生就是需要知道信息的观察者,当老师的电话号码发生改变时,学生得到通知,并更新相应的电话记录。具体实例如下:
Subject代码:
public interface Subject{
??? public void attach(Observer o);
??? public void detach(Observer o);
??? public void notice();
}Observer代码:
public interface Observer{
??? public void update();
}Teacher代码;
import java.util.Vector;
public class Teacher implements Subject{
??? private String phone;
??? private Vector students;
??? public Teacher(){
?????? phone = "";
?????? students = new Vector();
??? }
??? public? void attach(Observer o){
?????? students.add(o);
??? }
??? public void detach(Observer o){
?????? students.remove(o);
??? }
??? 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;
??? }
}Student代码:
public class Student implements Observer{
??? private String name;
??? private String phone;
??? private Teacher teacher;
??? public Student(String name,Teacher t){
?????? this.name = name;
?????? teacher = t;
??? }
??? public void show(){
?????? System.out.println("Name:"+name+"\nTeacher'sphone:"+phone);
??? }
??? public void update(){
?????? phone = teacher.getPhone();
??? }
}
Client代码:
package observer;
import java.util.Vector;
public class Client{???????? -->可以只定义目标者,观察者,另外的vector,只为了输入结果.
??? public static void main(String[] args){
?????? Vector students = new Vector();
?????? Teacher t = new Teacher();
?????? for(int i= 0 ;i<10;i++){
?????????? Student st = new Student("lili"+i,t);
?????????? students.add(st);
?????????? t.attach(st);
?????? }
?????? t.setPhone("88803807");
?????? for(int i=0;i<10;i++)
????????????? ((Student)students.get(i)).show();
?????? t.setPhone("88808880");
?????? for(int i=0;i<10;i++)
????????????? ((Student)students.get(i)).show();
??? }
}总结:Observer模式的最知名的应用是在MVC结构,Observer模式可以很好的应用在文档和图表程序的制作中。转自:http://shenzhenchufa.blog.51cto.com/730213/161581

热点排行