Android中的觀察者模式
阿新 • • 發佈:2018-12-24
最簡單的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。