观察者模式:
(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