java设计模式之观察者模式

概述:定义对象间的一对多的依赖关系,当一个对象发生改变时,所以依赖它的对象得到通知并作出相应更新。

适应场景:用于一对多依赖关系对象间,当被依赖者变化时,通知依赖者全部进行更新,被依赖者(Subject)应该有添加/删除依赖者(Observer)的方法,且可以把添加的依赖者放到一个容器中,且有一个方法去通知依赖者进行更新(update())。

思想:建立目标(Subject)和观察者(Observer)接口

目标接口:

            建立一个注册观察者对象接口 public void attach(Observer o);

            建立一个删除观察者对象接口 public void detach(Observer o);

            建立一个当目标状态发生改变时,发布通知给观察者对象接口 public void notice();

观察者接口:

            建立一个当收到目标通知后的更新接口: public void update();

示例:老师电话号码与学生,老师就是一个目标(Subject),学生就是观察者(Observer),当老师电话号码改变了,就要通知学生,并更新相应的电话记录。


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();
    }
}

参考:http://www.cnblogs.com/hnrainll/archive/2011/12/29/2305582.html




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值