java设计模式之观察者模式

一、基本概念:
       观察者模式属于行为型模式,其意图是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
       这一个模式的关键对象是目标(Subject)和观察者(Observer)。一个目标可以有任意数目的依赖它的观察者,一旦目标的状态发生改变,所有的观察者都得到通知,作为对这个通知的响应,每个观察者都将查询目标以使其状态与目标的状态同步。
适用场景:
       观察者模式,用于存在一对多依赖关系的对象间,当被依赖者变化时,通知依赖者全部进行更新。因此,被依赖者应该有添加/删除依赖者的方法,且可以将添加的依赖者放到一个容器中;且有一个方法去通知所有依赖者进行更新。一般Observer模式的最知名的应用是在MVC结构,Observer模式也可以应用在文档和图表程序的制作
二、实例:
       老师换号码,学生需要知道老师的号码必要时可以拨打。分析得出,老师就是一个被观察者(Subject),学生就是需要知道号码的观察者(Observer),当老师的电话号码发生改变时,学生得到通知,并更新相应的号码。
   思想:
        建立目标(subject)与观察者(observer)接口:
        //被观察者
        public interface Subject {
              public void add(Observer o);
              public void del(Observer o);
              public void notice();
        }
        //观察者
        public interface Observer {
              public void update();
        } 
        建立一个当目标状态发生改变时,发布通知给观察者对象的方法
public class Teacher implements Subject {
        private String phone;
        private Vector<Observer> students;
        public Teacher(){
               phone = "";
               students = new Vector<Observer>();
        }
        public void add(Observer o) {
               students.add(o);
        }
        public void del(Observer o) {
              students.remove(o);
        }
        public void notice() {
               for(int i=0;i<students.size();i++){
                       students.get(i).update();
              }
        }
        public String getPhone() {
              return phone;
        }
       public void setPhone(String phone) {
            this.phone = phone;
            notice();
       }
}
        建立一个当收到目标通知后的更新方法
public class Student implements Observer {
    private String name;
    private String phone;
    private Teacher teacher;
   
    public Student(String name,Teacher teacher){
               this.name = name;
               this.teacher = teacher;
    }
   
    public void show(){
              System.out.println("Name:"+name+"----Teacher's phone:"+phone);
    }
    
    public void update() {
             phone = teacher.getPhone();
    }
}
测试
public class ObserverTest {
 public static void main(String[] args) {
     Vector<Observer> students = new Vector<Observer>();
        Teacher teacher = new Teacher();
        for(int i= 0 ;i<10;i++){
            Student st = new Student("MM"+i,teacher);
            students.add(st);
            teacher.add(st);
        }
        teacher.setPhone("10086");
        for(int i=0;i<10;i++){
               ((Student)students.get(i)).show();
        }
        teacher.setPhone("1380013800");
        for(int i=0;i<10;i++){
               ((Student)students.get(i)).show();
        }
 }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值