《Android APP一定有的東西》之架構篇:觀察者模式

分類:技術 時間:2016-10-25

先說點兒別的,今天在群里看到了有人問觀察者模式,之前覺得好像沒有必要寫一個這個。但是轉念一想,自己剛接觸這些模式的時候簡直一頭霧水,我能一個類一個類的寫為什么要用接口?我能實現為什么要去優化?作為一個碼渣,功能完全實現不出bug已經是我最大的愿望嘞~然鵝。。。我也知道這是不對滴,代碼的系統性看起來很優雅,也是自己能掌握代碼的體現,而不是被功能支配。

Android中的常用的設計模式相關的內容并不多,前面一篇文章說到了工廠模式,這篇就說說觀察者。我覺得可以區分一下,這里指的代碼架構領域,跟項目架構領域的設計模式比起來,代碼領域自由靈活。對了,項目領域經常有一個詞:過度設計,也就是為了設計而設計。

關于什么時候開始學習設計模式,一個建議是不要為了模式去學,學了也用不上,當覺得自己的代碼自己看起來非常不順眼的時候,當你不自覺的發現有些代碼有點意思的時候,很自然的就會看到設計模式并且深入進去了,反正我是這么告訴自己的.../姚明笑~

上個并沒有什么暖用的小demo ObserverDemo

說明

這里先說說觀察者模式,引用一段來自解說RxJava的話:A 對象(觀察者)對 B 對象(被觀察者)的某種變化高度敏感,需要在 B 變化的一瞬間做出反應。 舉個例子,新聞里喜聞樂見的警察抓小偷,警察需要在小偷伸手作案的時候實施抓捕。在這個例子里,警察是觀察者,小偷是被觀察者,警察需要時刻盯著小偷的一舉一動,才能保證不會漏過任何瞬間。 程序的觀察者模式和這種真正的『觀察』略有不同,觀察者不需要時刻盯著被觀察者(例如 A 不需要每過 2ms 就檢查一次 B 的狀態),而是采用注冊(Register)或者稱為訂閱(Subscribe)的方式,告訴被觀察者:我需要你的某某狀態,你要在它變化的時候通知我。 Android 開發中一個比較典型的例子是點擊監聽器 OnClickListener 。對設置 OnClickListener 來說, View 是被觀察者, OnClickListener 是觀察者,二者通過 setOnClickListener() 方法達成訂閱關系。訂閱之后用戶點擊按鈕的瞬間,Android Framework 就會將點擊事件發送給已經注冊的 OnClickListener 。 原文:給 Android 開發者的 RxJava 詳解

來啊!實現一個抓小偷的故事!

定義觀察者

public interface Watcher {//長眼睛的
    void Discover(String s);//好像發現了什么
}

定義被觀察者接口,需要被觀察的行為

public interface Mistakable {//可能會搞事的

    void add(Watcher watcher);//引起一些長眼睛的人注意,注冊

    void steal(String s);//搞事
}

被觀察者實現被觀察者接口里面的方法

public class Tom implements Mistakable {//Tom就是可能搞事的人,現在他打算搞點什么
    // 技術不行,可能被好多人看到
    private Listlt;Watchergt; mWatchers = new ArrayListlt;gt;();

    @Override
    public void add(Watcher watcher) {
        mWatchers.add(watcher);//被看到了
    }

    @Override
    public void steal(String s) {//開始偷東西的時候被以下這些人發現了,然后發出了一些信號
        for (Watcher watcher : mWatchers) {
            watcher.Discover(s);
        }

    }
}

實現觀察者接口并實現發出信號的方法

public class MainActivity extends AppCompatActivity implements Watcher {
    private TextView mTextView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.tv);

        mTextView.setText(quot;聽說tom要搞一個炸彈,有人在監視他quot;);
        new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                doSomeThing();//搞事
                return false;
            }
        }).sendEmptyMessageDelayed(0, 3000);
    }
    private void doSomeThing() {
        Tom tom = new Tom();//tom來了
        tom.add(this);//引起注意了
        tom.steal(quot;偷到了一臺三桑note7quot;);//開始搞事了
    }
    @Override
    public void Discover(String s) {
        mTextView.setText(quot;tom被發現quot;   s   quot;,誒不抓了不抓了~quot;);
    }
}

效果圖

我是圖

關于接口函數

接口回調是觀察者模式的一種實現方式,屬于觀察者模式,只不過接口回調在實際運用中只有一個觀察者,上面demo改造參看實例: Java設計模式-回調函數和觀察者模式

【架構篇】擴展閱讀

《Android APP可以有的東西》之架構篇:工廠設計模式

本文作者:paradoxie

個人主頁: 謝盒盒的小黑屋,不止說技術

簡書地址:簡書主頁,專注技術類

github地址: paradoxie

轉載請注明出處,蟹蟹!


Tags: 觀察者模式 安卓開發

文章來源:http://www.jianshu.com/p/6953fca332cf


ads
ads

相關文章
ads

相關文章

ad