1. 程式人生 > >Android中的觀察者模式

Android中的觀察者模式

最簡單的Android觀察者模式的實現Demo,通過這個例子wome我們可以學習到觀察者模式的基本yong用法,在後續的開發工作中我們可以根據這個思想設計出更好的產品。

觀察者模式是:當一個物件的狀態傳送改變時,所有依賴於它的物件都能得到通知並被自動更新。

下面介紹一種簡單的使用方法,(下面有demo連結)先看一下project的目錄構成:

ObserverListener是觀察者介面,SubjectListener是被觀察者介面,ObserverManager是觀察者的管理類。

1 /**
2  * Created by Acer on 2018/9/18.
3  * 觀察者介面
4  */
5 
6 public interface ObserverListener {
7     void observerUpData(String content);//重新整理操作
8 }

 

 

 1 /**
 2  * Created by Acer on 2018/9/18..
 3  * 被觀察者介面
 4  */
 5 
 6 public interface SubjectListener {
 7     void add(ObserverListener observerListener);
 8     void notifyObserver(String content);
 9     void remove(ObserverListener observerListener);
10 }

 

下面是比較重要的管理類:

 1 public class ObserverManager implements SubjectListener {
 2     private static ObserverManager observerManager;
 3     //觀察者介面集合
 4     private List<ObserverListener> list = new ArrayList<>();
 5 
 6     /**
 7      * 單例
 8      */
 9     public static ObserverManager getInstance(){
10         if (null == observerManager){
11             synchronized (ObserverManager.class){
12                 if (null == observerManager){
13                     observerManager = new ObserverManager();
14                 }
15             }
16         }
17         return observerManager;
18     }
19 
20     /**
21      * 加入監聽佇列
22      */
23     @Override
24     public void add(ObserverListener observerListener) {
25         list.add(observerListener);
26     }
27 
28     /**
29      * 通知觀察者重新整理資料
30      */
31     @Override
32     public void notifyObserver(String content) {
33         for (ObserverListener observerListener : list){
34             observerListener.observerUpData(content);
35         }
36     }
37 
38     /**
39      * 監聽佇列中移除
40      */
41     @Override
42     public void remove(ObserverListener observerListener) {
43         if (list.contains(observerListener)){
44             list.remove(observerListener);
45         }
46     }
47 }

 

效果是當點選ThirdActivity中的按鈕時,執行ObserverManager.getInstance().notifyObserver("觀察者請重新整理資訊");

然後所有新增到監聽佇列的Activity都會更新資料,ObserverManager.getInstance().add(this)就是新增到監聽佇列的方法,更新操作執行在observerUpData(String content)方法中。

下面是3個Activity,很簡單:

 1 public class MainActivity extends AppCompatActivity implements ObserverListener {
 2     private TextView textView;
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7         textView = (TextView) findViewById(R.id.tv);
 8         findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
 9             @Override
10             public void onClick(View v) {
11                 //ObserverManager.getInstance().notifyObserver("觀察者請重新整理資訊");
12                 Intent intent = new Intent(MainActivity.this,SecondActivity.class);
13                 startActivity(intent);
14             }
15         });
16 
17         //註冊
18         ObserverManager.getInstance().add(this);
19 
20     }
21 
22     @Override
23     public void observerUpData(String content) {
24         Log.d("vvvvvvvvvvvvvvv","11111111111");
25         textView.setText(content);
26     }
27 }

 

 

 1 public class SecondActivity extends AppCompatActivity implements ObserverListener {
 2     private TextView textView;
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_second);
 7         textView = (TextView) findViewById(R.id.tv2);
 8         findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
 9             @Override
10             public void onClick(View v) {
11                 Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
12                 startActivity(intent);
13             }
14         });
15 
16         //註冊
17         ObserverManager.getInstance().add(this);
18     }
19 
20     @Override
21     public void observerUpData(String content) {
22         Log.d("vvvvvvvvvvvvvvv","2222222222");
23         textView.setText(content);
24     }
25 }

 

 

 1 public class ThirdActivity extends AppCompatActivity implements ObserverListener {
 2     private TextView textView;
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_third);
 7         textView = (TextView) findViewById(R.id.tv3);
 8         findViewById(R.id.btn3).setOnClickListener(new View.OnClickListener() {
 9             @Override
10             public void onClick(View v) {
11                 ObserverManager.getInstance().notifyObserver("觀察者請重新整理資訊");
12             }
13         });
14 
15         //註冊
16         ObserverManager.getInstance().add(this);
17     }
18 
19     @Override
20     public void observerUpData(String content) {
21         Log.d("vvvvvvvvvvvvvvv","33333333333");
22         textView.setText(content);
23     }
24 }

 

佈局都是一個TextView和一個Button。