一個(gè)例子介紹觀察者模式

觀察者模式簡(jiǎn)單說(shuō)就是朝鮮放原子彈,中美俄都知道了
下面通過(guò)一個(gè)項(xiàng)目中的需求來(lái)說(shuō)明
比如有兩個(gè)頁(yè)面對(duì)用戶登錄敏感,也就是用戶登錄后要有相應(yīng)的變化.怎么辦?用觀察者
下面看看具體實(shí)現(xiàn):
1.首先定義一個(gè)用戶登錄的接口

//用戶登錄的接口
public interface onUserLoginListener {
    void userLogin();
}

2.然后實(shí)現(xiàn)一個(gè)該監(jiān)聽(tīng)的管理類

public class ListenerManager {
    //單例
    public static volatile  ListenerManager instance;
    private List<onUserLoginListener> list = new ArrayList<>();
    private ListenerManager(){}
    public static ListenerManager getInstance(){
        if (instance == null){
            synchronized (ListenerManager.class){
                if (instance == null){
                    instance = new ListenerManager();
                }
            }
        }
        return instance;
    }

    //添加監(jiān)聽(tīng)
    public void addListener(onUserLoginListener listener){
        list.add(listener);
    }
    //移除監(jiān)聽(tīng)
    public void removeListener(onUserLoginListener listener){
        list.remove(listener);
    }
    //獲取所有的監(jiān)聽(tīng)
    public List<onUserLoginListener> getAllListeners(){
        return list;
    }
}

3.然后在需要監(jiān)聽(tīng)用戶登錄的頁(yè)面設(shè)置監(jiān)聽(tīng),比如這里的MainActivity和Main2Activity


public class MainActivity extends AppCompatActivity implements onUserLoginListener {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //將該頁(yè)面添加到監(jiān)聽(tīng)中
        ListenerManager.getInstance().addListener(this);

        tv = (TextView) findViewById(R.id.tv);
        //去Main2Activity頁(yè)面
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this,Main2Activity.class));
            }
        });
    }

    //實(shí)現(xiàn)onUserLoginListener接口,這里寫用戶登錄后這個(gè)頁(yè)面的操作
    @Override
    public void userLogin() {
        System.out.println("MainActivity頁(yè)面收到了用戶登錄的監(jiān)聽(tīng)");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //移除監(jiān)聽(tīng)
        ListenerManager.getInstance().removeListener(this);
    }
}
public class Main2Activity extends AppCompatActivity implements onUserLoginListener{
    private TextView tv_login;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        //將該頁(yè)面添加到監(jiān)聽(tīng)中
        ListenerManager.getInstance().addListener(this);

        tv_login = (TextView) findViewById(R.id.tv_login);
        //去登錄頁(yè)面
        tv_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(Main2Activity.this,LoginActivity.class));
            }
        });
    }

    @Override
    public void userLogin() {
        System.out.println("Main2Activity頁(yè)面收到了用戶登錄的監(jiān)聽(tīng)");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        ListenerManager.getInstance().removeListener(this);
    }
}

4.在實(shí)現(xiàn)登錄的頁(yè)面把登錄的消息發(fā)送給所有的監(jiān)聽(tīng)者

//登錄頁(yè)面
public class LoginActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login2);
    }

    @Override
    protected void onResume() {
        super.onResume();
        //這里模擬登錄操作,3s后該頁(yè)面銷毀,返回上一頁(yè)面,登錄成功
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //登錄成功后要通知所有的監(jiān)聽(tīng)用戶登錄的頁(yè)面,這里是關(guān)鍵!!!
        //ListenerManager記錄了所有監(jiān)聽(tīng)用戶登錄的頁(yè)面,也就是記錄了所有實(shí)現(xiàn)了onUserLoginListener接口的類
        List<onUserLoginListener> allListeners = ListenerManager.getInstance().getAllListeners();
        if (allListeners != null){
            for (int i = 0; i < allListeners.size(); i++) {
                //每個(gè)實(shí)現(xiàn)了監(jiān)聽(tīng)的類都調(diào)用其實(shí)現(xiàn)的userLogin()方法,就像MainActivity在收到監(jiān)聽(tīng)后會(huì)調(diào)用其重寫的userLogin()
                allListeners.get(i).userLogin();
            }
        }

        finish();
    }
}

我們的操作是由MainActivity進(jìn)入到Main2Activity,再進(jìn)入到LoginActivity
LoginActivity等待3秒后關(guān)閉
最后打印日志:

16:15:38.986 7976-7976/com.dgtech.sss.observedemo I/System.out: MainActivity頁(yè)面收到了用戶登錄的監(jiān)聽(tīng)
16:15:38.986 7976-7976/com.dgtech.sss.observedemo I/System.out: Main2Activity頁(yè)面收到了用戶登錄的監(jiān)聽(tīng)

以上就是觀察者模式的精髓所在,具體實(shí)現(xiàn)要根據(jù)需求來(lái)寫,不要被網(wǎng)上的各種例子局限.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捷犹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子娱仔,更是在濱河造成了極大的恐慌福压,老刑警劉巖妓蛮,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翼悴,死亡現(xiàn)場(chǎng)離奇詭異赡矢,居然都是意外死亡溅潜,警方通過(guò)查閱死者的電腦和手機(jī)肋演,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門抑诸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人爹殊,你說(shuō)我怎么就攤上這事蜕乡。” “怎么了梗夸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵层玲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)辛块,這世上最難降的妖魔是什么畔派? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮润绵,結(jié)果婚禮上线椰,老公的妹妹穿的比我還像新娘。我一直安慰自己尘盼,他們只是感情好士嚎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著悔叽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爵嗅。 梳的紋絲不亂的頭發(fā)上娇澎,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音睹晒,去河邊找鬼趟庄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛伪很,可吹牛的內(nèi)容都是我干的戚啥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼锉试,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼猫十!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起呆盖,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拖云,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后应又,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宙项,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年株扛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尤筐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洞就,死狀恐怖盆繁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情旬蟋,我是刑警寧澤改基,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響秕狰,放射性物質(zhì)發(fā)生泄漏稠腊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一鸣哀、第九天 我趴在偏房一處隱蔽的房頂上張望架忌。 院中可真熱鬧,春花似錦我衬、人聲如沸叹放。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)井仰。三九已至,卻和暖如春破加,著一層夾襖步出監(jiān)牢的瞬間俱恶,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工范舀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留合是,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓锭环,卻偏偏與公主長(zhǎng)得像聪全,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辅辩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,735評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理难礼,服務(wù)發(fā)現(xiàn),斷路器玫锋,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • 1 場(chǎng)景問(wèn)題# 1.1 訂閱報(bào)紙的過(guò)程## 來(lái)考慮實(shí)際生活中訂閱報(bào)紙的過(guò)程鹤竭,這里簡(jiǎn)單總結(jié)了一下,訂閱報(bào)紙的基本流程...
    七寸知架構(gòu)閱讀 4,598評(píng)論 5 57
  • 過(guò)去的我不是我 現(xiàn)在的我不是我 未來(lái)的我不是我 我是我 是我 前一秒 這一秒 下一秒 哪個(gè)是我 嗯
    五一大閱讀 165評(píng)論 0 0
  • 天暗下來(lái)了景醇,雨下了下來(lái) 舒夢(mèng)對(duì)思遠(yuǎn)說(shuō)“我去個(gè)廁所臀稚,你等我一下∪担”思遠(yuǎn)說(shuō):“哦吧寺,好∩⒔伲”過(guò)了一會(huì)兒稚机,舒夢(mèng)出來(lái)了,目光呆...
    來(lái)自心靈的黑暗閱讀 236評(píng)論 0 0