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

相關文章
相關標籤/搜索