Android常用设计模式——观察者模式
2017-11-01 13:16
357 查看
了解过单例模式,建造者模式,现在来看一看观察者模式。
自己刚接触这些模式的时候简直一头雾水,我能一个类一个类的写为什么要用接口?我能实现为什么要去优化?
废话不多说,说说观察者模式吧。
观察者模式又被称作 发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
A 对象(观察者)对 B 对象(被观察者)的某种变化高度敏感,需要在 B 变化的一瞬间做出反应。
接口回调是观察者模式的一种实现方式,属于观察者模式,只不过接口回调在实际运用中只有一个观察者。
举个例子,新闻里喜闻乐见的警察抓小偷,警察需要在小偷伸手作案的时候实施抓捕。在这个例子里,警察是观察者,小偷是被观察者,警察需要时刻盯着小偷的一举一动,才能保证不会漏过任何瞬间。
程序的观察者模式和这种真正的『观察』略有不同,观察者不需要时刻盯着被观察者(例如 A 不需要每过 2ms 就检查一次 B 的状态),而是采用注册(Register)或者称为订阅(Subscribe)的方式,告诉被观察者:我需要你的某某状态,你要在它变化的时候通知我。
Android 开发中一个比较典型的例子是点击监听器 OnClickListener 。对设置 OnClickListener 来说, View 是被观察者, OnClickListener 是观察者,二者通过 setOnClickListener() 方法达成订阅关系。订阅之后用户点击按钮的瞬间,Android Framework 就会将点击事件发送给已经注册的 OnClickListener 。
虽然有3个观察者,注释掉一行代码,只有2个观察者订阅消息,查看调试结果
可以看出此时,只有观察者张三1和张三2收到订阅消息了。因为张三3没有被加入到观察者的List中。
将以上注释掉的代码稍作修改,如图
这样观察者张三1,同样收不到订阅消息。observable.deleteObserver(observer1);
总结:
1.被观察者MyObservable中的核心就是setChanged()和notifyObservers(String content),标识内容发生改变并且通知观察者。
2.观察者Observer 重写update(Observable observable,Object o)方法,从被观察者中获得数据并作出相应改变。
以上是我所接触的最容易理解的观察者模式,让我们再看看其他的典型例子。
栗子来自哪些帮助我的简书
一个特别普通的观察者,身无长物,能及时发现罪犯。
一个子承父业的小偷Tom;
总结:
1.定义观察者
2.定义被观察者接口,需要被观察的行为
3.被观察者实现被观察者接口里面的方法
4.实现观察者接口并实现发出信号的方法
观察者模式就这样搞定了!
自己刚接触这些模式的时候简直一头雾水,我能一个类一个类的写为什么要用接口?我能实现为什么要去优化?
废话不多说,说说观察者模式吧。
观察者模式又被称作 发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
A 对象(观察者)对 B 对象(被观察者)的某种变化高度敏感,需要在 B 变化的一瞬间做出反应。
接口回调是观察者模式的一种实现方式,属于观察者模式,只不过接口回调在实际运用中只有一个观察者。
举个例子,新闻里喜闻乐见的警察抓小偷,警察需要在小偷伸手作案的时候实施抓捕。在这个例子里,警察是观察者,小偷是被观察者,警察需要时刻盯着小偷的一举一动,才能保证不会漏过任何瞬间。
程序的观察者模式和这种真正的『观察』略有不同,观察者不需要时刻盯着被观察者(例如 A 不需要每过 2ms 就检查一次 B 的状态),而是采用注册(Register)或者称为订阅(Subscribe)的方式,告诉被观察者:我需要你的某某状态,你要在它变化的时候通知我。
Android 开发中一个比较典型的例子是点击监听器 OnClickListener 。对设置 OnClickListener 来说, View 是被观察者, OnClickListener 是观察者,二者通过 setOnClickListener() 方法达成订阅关系。订阅之后用户点击按钮的瞬间,Android Framework 就会将点击事件发送给已经注册的 OnClickListener 。
package com.example.mytry; import android.util.Log; import java.util.Observable; import java.util.Observer; /** * 观察者,根据姓名定义观察者 */ public class MyObserver implements Observer { private String name; public MyObserver(String name) { this.name = name; } @Override public void update(Observable o, Object arg) { Log.i("xiaoming","Hello," + name + ",LOL更新啦,内容:" + arg); } @Override public String toString() { return "玩家:"+name; } }
package com.example.mytry; import java.util.Observable; /** * 被观察者,一个构造方法,一个发布消息给观察者的方法 */ public class MyObservable extends Observable { public MyObservable() { super(); } public void postNewPublication(String content) { //标识内容或者状态发生改变 setChanged(); //通知所有观察者 notifyObservers(content); } }
package com.example.mytry; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; /** * 3个观察者,1个被观察者 */ public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyObserver observer1 = new MyObserver("张三1"); MyObserver observer2 = new MyObserver("张三2"); MyObserver observer3 = new MyObserver("张三3"); MyObservable observable =new MyObservable(); observable.addObserver(observer1); observable.addObserver(observer2); //observable.addObserver(observer3); observable.p d22b ostNewPublication("订阅内容到了!!!!"); } }
虽然有3个观察者,注释掉一行代码,只有2个观察者订阅消息,查看调试结果
可以看出此时,只有观察者张三1和张三2收到订阅消息了。因为张三3没有被加入到观察者的List中。
将以上注释掉的代码稍作修改,如图
这样观察者张三1,同样收不到订阅消息。observable.deleteObserver(observer1);
总结:
1.被观察者MyObservable中的核心就是setChanged()和notifyObservers(String content),标识内容发生改变并且通知观察者。
2.观察者Observer 重写update(Observable observable,Object o)方法,从被观察者中获得数据并作出相应改变。
以上是我所接触的最容易理解的观察者模式,让我们再看看其他的典型例子。
栗子来自哪些帮助我的简书
package com.example.mytry; /** * 观察者 */ public interface Watcher { void discover(String s); }
一个特别普通的观察者,身无长物,能及时发现罪犯。
package com.example.mytry; /** * 被观察者 */ public interface Misstake { void add(Watcher watcher); void steal(String s); }
一个子承父业的小偷Tom;
package com.example.mytry; import java.util.ArrayList; import java.util.List; /** * 被观察者TOM */ public class Tom implements Misstake { private List<Watcher> mWatchers = new ArrayList<>(); @Override public void add(Watcher watcher) { mWatchers.add(watcher); } @Override public void steal(String s) { for (Watcher one : mWatchers) { one.discover(s); } } }
package com.example.mytry; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.widget.TextView; /** * 观察者模式案例 */ public class MainActivity extends AppCompatActivity implements Watcher { private TextView button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (TextView) findViewById(R.id.button); button.setText("我是警察"); new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { doThings(); return false; } }).sendEmptyMessageDelayed(0, 3000); } private void doThings() { Tom tom = new Tom(); tom.add(this); tom.steal("偷走一块手表"); } @Override public void discover(String s) { button.setText("发现有人" + s); Log.i("tom", "发现有人" + s); } }
总结:
1.定义观察者
2.定义被观察者接口,需要被观察的行为
3.被观察者实现被观察者接口里面的方法
4.实现观察者接口并实现发出信号的方法
观察者模式就这样搞定了!
相关文章推荐
- android中常用的设计模式 --- 观察者模式
- Android 内功心法(1.3)——android常用设计模式之观察者模式
- 最常用的Java设计之一 观察者模式 在android中的实例 ListView Adapter机制
- Android 设计模式:(二)观察者模式 —— 让你的对象知悉现况
- Android设计模式 — 观察者模式
- Java常用类库--观察者设计模式( Observable类Observer接口)
- Android 设计模式:(二)观察者模式 —— 让你的对象知悉现况
- Android设计模式系列(2)--SDK源码之观察者模式
- 最常用的设计模式---观察者模式(C++实现)
- Android使用的设计模式1——观察者模式
- Android开发中常用的设计模式
- Android 设计模式 之 观察者模式
- Android设计模式学习日记03--观察者模式
- Android设计模式系列(2)--SDK源码之观察者模式
- 浅学设计模式之观察者<Observer>模式及在android中的应用
- Android[高级教程] 设计模式之五 观察者模式
- Android设计模式-之观察者模式
- Android设计模式系列(2)--SDK源码之观察者模式
- Android设计模式系列--观察者模式
- Android 设计模式:(二)观察者模式 —— 让你的对象知悉现况