Design Pattern学习笔记 --- 观察者(Observer)模式

一:Observer模式的类图:java

二:说明:

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象能够同时监听某个主题对象,当这个对象在状态上发生变化时,这个主题对象会通知全部的观察者对象,让他们可以自动地更新本身.
    理解:
    1.观察者模式定义了一种一对多的依赖关系;指的是主题对象中有一个集合属性,这个集合属性能够用来保存其对象的观察者对象;如JDK对观察者模式中的代码实例:
   
    /**主题对象中的一个集合属性,用来保存中未来要通知的观察者对象**/
    private Vector obs;

    /**为主题对象增长一个观察者的方法**/
    public synchronized void addObserver(Observer o)
    {
        if (o == null)
        {
            throw new NullPointerException();

        }
        if (!obs.contains(o))
        {
            obs.addElement(o);
        }
     }

    /**为主题对象移除一个观察者的方法**/
     public synchronized void deleteObserver(Observer o)
     {
        obs.removeElement(o);
     }

     2.这个对象在状态上发生变化:指的是主题对象有一个属性,来专门表示自身的状态是否有发生变化.以下代码:
     /** 标识主题对象状态是否改变的字段 **/
     private boolean changed = false;

     /** 设定主题对象状态改变的方法,咱们能够Override这个方法来加入与本身业务相关的逻辑; **/
    protected synchronized void setChanged()
    {
        changed = true;
    }

    /** 重置状态改变的方法 **/
    protected synchronized void clearChanged()
    {
        changed = false;
    }

    /** 返回状态的更改; **/
    public synchronized boolean hasChanged()
    {
        return changed;
    }

    3.这个主题对象会通知全部的观察者对象,让他们可以自动地更新本身. 表示在主题对象中,它会一个方法去循环调用每一个观察者对象怎么的update方法;以下:
    /**不须要返回主题对象**/
    public void notifyObservers()
    {
        notifyObservers(null);
    }

    /**返回主题对象的信息**/
    public void notifyObservers(Object arg)
    {
        Object[] arrLocal;
        synchronized (this)
        {
            if (!changed)
            {
                return;
            }
            arrLocal = obs.toArray();
            clearChanged();
        }
        for (int i = arrLocal.length-1; i>=0; i--)
        {
            ((Observer)arrLocal[i]).update(this, arg);
        }
    }
     
三:实例说明
    场景:
    在学校里,当中午放学的铃声一响时,老师会回办公室,食堂准备开饭,有些学生准备回家;
    Mapping:
    闹铃--被观察者对象(主题对象)
    老师,学生,食堂 -- 观察者对象.

    用Java程序来实现这个场景;只需要主题对象继承抽象Observable这个类, 老师,学生,食堂继承Observer这个类,再实现与业务相关的方法就能够了;

    /**
    * 观察者模式中的具体主题角色
    */
    package com.skywares.designpattern.observer;

    import java.util.Observable;

    /**
    * @author Administrator
     *
    */
    public class Alarm extends Observable
    {
        public void signalEnd()
        {
            System.out.println("end .....");
       
            /** 设置状态改变  **/
            this.setChanged();
       
            /** 通知观察者 **/
            this.notifyObservers();
        }
    }

    /**
     * 观察者模式中的具体观察者角色
    */
    package com.skywares.designpattern.observer;
    import java.util.Observable;
    import java.util.Observer;

    public class Canteen implements Observer
    {
        @Override
        public void update(Observable o, Object arg)
        {
            System.out.println(" ready to meat... ");
        }
    }
   
    /**
     * 观察者模式中的具体观察者角色
    */
    package com.skywares.designpattern.observer;

    import java.util.Observable;
    import java.util.Observer;

    public class Student implements Observer
    {
        @Override
        public void update(Observable o, Object arg)
        {
            System.out.println("student go home ....");
        }
    }

    package com.skywares.designpattern.observer;

    import java.util.Observable;
    import java.util.Observer;

    /**
    * @author Administrator
    * 观察者模式中的具体观察者角色
    *
    */
    public class Teacher implements Observer
    {
        @Override
        public void update(Observable o, Object arg)
        {
            System.out.println("teacher go to office ");
        }
    }

    /**
    * 测试实现
    */
    package com.skywares.designpattern.observer;

    /**
     * @author Administrator
    *
    */
    public class TestObservable
    {
        /**
        * @param args
        */
        public static void main(String[] args)
        {
            Alarm alarm = new Alarm();
       
            Teacher t = new Teacher();
            Student s = new Student();
            Canteen c = new Canteen();
       
            alarm.addObserver(t);
            alarm.addObserver(s);
            alarm.addObserver(c);
       
            alarm.signalEnd();
        }
    }app

相关文章
相关标签/搜索