Java裏面的觀察者模式,是一個很是經典的模式,常常在開發中被用到,掌握了這個思想,我相信對於一些開發,受益是匪淺的;鄙人也是以爲比較不錯,因此發表一點本身的總結,若是對還處於迷茫的你有稍微的幫助的話,鄙人很高興;下面就讓咱們共同的理解一下:java
1、需求:android
在開發的過程當中咱們會遇到比較實際額問題就是好比一個事物某種狀態發生了改變,想讓其餘關心它的事物知道,而不是,其餘的事物一直看着它,那麼就能夠抽出一個基本的思想,就是讓關心的事物訂閱被關心的事物,而後被關心的事物一旦有了改變就去通知關心的事物,以下圖: app
咱們能夠清楚的看出被觀察者要作的事情,就是添加觀察者、刪除觀察者以及狀態更新以後要通知觀察者作相應的操做,而觀察者,就是獲得數據;到此的話,彷佛有點眉目了;ide
2、設計:測試
知道了思路了,就是須要把思路設計出來;接下來,咱們就本身化抽象爲具體,化腐朽爲神奇:this
被觀察者(成爲目標對象):Subject.net
觀察者:(監督者):Observer設計
Subject類的實現:code
import java.util.ArrayList; import java.util.List; /** *建立人:UncleMin *時間:2017/3/11 0011-下午 6:58 *描述:Subject:目標對象;註冊與通知觀察者 *連接:http://blog.csdn.net/wz1993_0719/article/details/60783657 */ public class Subject{ private List<Observer> observers = new ArrayList<>(); public void addObserver(Observer observer){ //添加觀察者的方法: observers.add(observer); } public void removeObserver(Observer observer){ //刪除觀察者 observers.remove(observer); } protected void notifyObserves(){ //通知觀察者 for (Observer observer:observers) { observer.updata(this); } } }
Observer類的實現:server
/** *建立人:UncleMin *時間:2017/3/11 0011-下午 6:15 *描述:觀察者的接口對象:Observer *連接:http://blog.csdn.net/wz1993_0719/article/details/60783657 */ public interface Observer { //更新方法 public void updata(Subject subject); }
上面Observable被觀察者的基類,爲了給具體被觀察者繼承的,而Observer是接口,裏面的方法是刷新數據的;
3、下面就是具體的調用和實現:
import java.util.Observable; /** *建立人:UncleMin *時間:2017/3/11 0011-下午 6:59 *描述:ConcreteSubject:具體的目標對象,負責數據完成以後通知觀察者ds *連接:http://blog.csdn.net/wz1993_0719/article/details/60783657 */ public class ConcreteSubject extends Subject { private String mContent; public String getmContent() { return mContent; } public void setmContent(String mContent) { this.mContent = mContent; notifyObserves(); } } ** *建立人:UncleMin *時間:2017/3/11 0011-下午 6:57 *描述:ConcreteObserver:具體的實現觀察者對象 *連接:http://blog.csdn.net/wz1993_0719/article/details/60783657 */ public class ConcreteObserver implements Observer { @Override public void updata(Subject subject) { String s = ((ConcreteSubject) subject).getmContent(); Log.e("ob", "updata: "+s); } }
測試調用:
import android.app.Activity; import android.os.Bundle; import android.view.View; /** * 建立人:UncleMin * 時間:2017/3/11 0011-下午 6:28 * 描述: * 連接:http://blog.csdn.net/wz1993_0719/article/details/60783657 */ public class ObserverActivity extends Activity { private ConcreteSubject subject; private ConcreteObserver observer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_observe); subject = new ConcreteSubject(); observer = new ConcreteObserver(); subject.addObserver(observer); } public void onClick(View view) { int id = view.getId(); switch (id){ case R.id.btn_send: subject.setmContent("我是天氣晴朗哦,嘻嘻!"); break; case R.id.btn_remove: subject.removeObserver(observer); break; } } @Override protected void onDestroy() { super.onDestroy(); } } <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/btn_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="onClick" android:onClick="onClick" /> <Button android:id="@+id/btn_remove" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="remove" android:onClick="onClick" /> </LinearLayout>
上面就是觀察者模式的通用的思路與代碼,到這裏其實回過頭來,明白了思想,其實也是很簡單的,固然,這麼經典的東西,Java的編寫人確定不會遺漏的,其實java裏面的Util包已經給咱們寫好了兩個基類,咱們用的時候能夠直接的調用就ok了;
4、下面就是Java包下的引用:
被觀察者:
package com.example.wz.mystudydemo; import java.util.Observable; /** *建立人:UncleMin *時間:2017/3/11 0011-下午 6:59 *描述:ConcreteSubject:具體的目標對象,負責數據完成以後通知觀察者ds *連接:http://blog.csdn.net/wz1993_0719/article/details/60783657 */ public class ConcreteSubject extends Observable { private String mContent; public String getmContent() { return mContent; } public void setmContent(String mContent) { this.mContent = mContent; setChanged(); notifyObservers(); } }
觀察者:
import android.util.Log;
import java.util.*;
/** *建立人:UncleMin *時間:2017/3/11 0011-下午 6:57 *描述:ConcreteObserver:具體的實現觀察者對象 *連接:http://blog.csdn.net/wz1993_0719/article/details/60783657 */ public class ConcreteObserver implements java.util.Observer { @Override public void update(Observable observable, Object data) { String s = ((ConcreteSubject) observable).getmContent(); Log.e("ob", "updata: "+s); } /*@Override public void updata(Subject subject) { String s = ((ConcreteSubject) subject).getmContent(); Log.e("ob", "updata: "+s); }*/ }
再觀察者模式裏面有兩種實現方式:推模模型和拉模型;如果感興趣的童鞋們能夠本身去研究一下,畢竟紙上得來終覺淺,絕知此事要躬行
總結:
1.觀察者模式的優勢:(1)實現了觀察者與目標時間的抽象解耦;(2)實現了動態聯動;(3)支持廣播通訊 2.缺點:引發無所謂的操做;例如一些不必的通知、