先說點兒別的,今天在群里看到了有人問觀察者模式,之前覺得好像沒有必要寫一個這個。但是轉念一想,自己剛接觸這些模式的時候簡直一頭霧水,我能一個類一個類的寫為什么要用接口?我能實現為什么要去優化?作為一個碼渣,功能完全實現不出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