設計模式之Observer(觀察者)模式

轉載請聲明出處:http://blog.csdn.net/qq_24692041/article/details/64438294

     

     觀察者模式在我們Android中被廣泛的應用,比如說我們平時常用到的監聽器,適配器的實現等等。今天我們來具體講一下Observer模式的具體實現思想。首先,觀察者模式的初步角色應該有觀察者,被觀察者兩個角色。我們再來看看這兩者的任務或者說職責都是啥!還有他們扮演的具體角色。

      被觀察者:1.自己會有數據變化的功能。2.當數據變化的時候,他要通知觀察者,所以應該有通知觀察者的功能,要通知觀察者。3.它必須知道都有誰在觀察他,所以它應該提供註冊觀察者的功能4.如果不想觀察的時候還可以移除掉,所以需要提供刪除觀察者的功能。

      觀察者:只有一個職責就是接收被觀察者的通知。

      好了,現在我們開始來代碼實現上面的理論。在設計模式的文章中我一直在強調一個東西,面向接口,面向抽象編程的思想。故而這兒我們應該是先根據上面的角色將抽象的角色寫出來,然後在有具體的實現角色去繼承抽象方法或者實現接口來完成我們的代碼!

     首先有一個被觀察者NumberGenerator抽象類,提供註冊觀察者,刪除觀察者,提供觀察者的方法。還需要提供兩個個抽象方法getNumber,execute讓觀察者能拿到數據,並且需要提供一個執行的方法,表示註冊等功能都做好了纔去執行。具體的生成數據,返回數據,則不具體規定,只是規定行爲,讓子類實現方法自由發揮。

/**
 * Created by PICO-USER on 2017/3/21.
 */

public abstract class NumberGenerator {
    //用於存儲對該類的所有觀察者
    private List observers = new LinkedList();

    //註冊觀察者
    public void registerObserver(Observer observer) {

        observers.add(observer);
    }

    //刪除觀察者
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    //通知觀察者更新數據
    public void notifyObservers() {

        Iterator iterator = observers.iterator();
        Observer observer = null;
        while (iterator.hasNext()) {
            observer = (Observer) iterator.next();
            observer.update(this);
        }
    }

    public abstract int getNumber();

    public abstract void execute();
}

還需要一個觀察者角色Observer,需要一個更新數據的方法,該方法需要一個被觀察者的對象,通過該對象獲取新的數據。因爲它的方法在這兒我們不需要具體實現,只需要規定某種行爲,所以我們寫成接口。

/**
 * Created by PICO-USER on 2017/3/21.
 */
public interface Observer {
    public abstract void update(NumberGenerator generator);
}

好了,到這兒。我們Observer的思想其實就已經傳達完畢了。剩下的就只是具體的實現,那就太簡單了,可以個人自由發揮!下面我給出一個實例:

      首先,具體的被觀察者角色入場。RandomNumberGenerator類繼承了NumberGenerator。實現了getNumber抽象方法和execute執行方法。用於返回具體的數據和生成具體數據。並且在數據發生改變之後調用父類的notifyObservers方法通知觀察者。

/**
 * Created by PICO-USER on 2017/3/21.
 */

public class RandomNumberGenerator extends NumberGenerator {

    private Random random = new Random();
    private int number;

    @Override
    public int getNumber() {
        return number;
    }

    @Override
    public void execute() {

        for (int i = 0; i < 20; i++) {
            number = random.nextInt(50);
            System.out.print("the new number has been created :" + number + "\n");
            notifyObservers();
        }
    }
}

接下來是具體的觀察者類的實現。很簡單實現了Observer接口,具體實現update方法。拿到數據打印。

/**
 * Created by PICO-USER on 2017/3/21.
 */

public class DigitObserver implements Observer {

    @Override
    public void update(NumberGenerator generator) {
        System.out.print("number update :" + generator.getNumber() + "\n");
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
好了,萬事俱備。就差最後一腳了。來看看具體的調用Run類。很簡單就是new了一個被觀察者,和一個觀察者,然後註冊觀察者。最後執行就行了。這兒注意new的是RandomNumberGenerator但是我是用他的父類NumberGenerator的引用去接的。包括Observer也是。注意這兒的差別,這就是一種設計模式的體現了,具體的被觀察者和具體的觀察者,根本不需要去知道一些跟自己無關的東西!這就是體現了設計模式的設計原則。具體是啥,需要網友自己慢慢去琢磨了。

public class Run {

    public static void main(String[] arg0) {

        NumberGenerator generator = new RandomNumberGenerator();
        Observer observer = new DigitObserver();
        generator.registerObserver(observer);
        generator.execute();
    }
}
 

     到這兒,設計模式就講完了。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章