l 问题的提出:
假设下面这样的一个场景,当我们使用一个手机软件的时候,需要使用到短信功能,而当前的页面不属于SMSManager的页面。这个时候,我们不能够先切换到SMSManager这个页面才能处理这个短信内容吧?那么该如何处理呢,这就需要使用到观察者模式了。
l 设计思想:
观察者模式就是应对于这种应用场景,当我们获得一些内容或数据更新时,主动通知所有需要处理或更新这些数据和内容的相关页面。从而获得相应内容的更新。
其中,在观察着模式中,有两个角色,观察着和被观察者。其中主动承担起通知任务的类称之为“被观察者”。等待通知的这些类就被成为“观察者”。由于这种设计模式和我们的订阅很类似,因此该模式也被称作“发布—订阅”模式。
观察者模式的主要实现方式是通过回调函数进行的。回调函数的思想就是,由对象A调用,但是实现内容却是由对象B来进行。基于这个思想,当对象A发生更新时,即可以通过调用回调函数,通知对象B进行相对应的更新。回调函数在C++中是通过函数指针的方式来实现,而在java中则是通过接口的方式来实现的。
为了简便起见,我们这里就以java的方式来做示例。我们就以短信接受的内容为例
l 示例代码:
l public class SMSReceiver extends BroadcastReceiver{
l // 其他的省略
/**
* 创建验证码监听接口
*/
public interface SMSContentListener {
void receiveContent(String SMSContent);
}
l public void onReceive(Contextcontext, Intent intent) {
l //为接受短信的功能
l // 此处即为调用短信接受的监听接口,但是,其实现部分并不在该对象内。
l smsContentListener.receiveContent(smsContent);
l }
/**
* 设置验证码监听响应
* @param contentListener
*/
public void setSMSContentListener(SMSContentListener contentListener) {
this.smsContentListener = contentListener;
}
下面我们展示调用这个接口,并对接口内容进行自定义实现的代码。
smsReceiver.setSMSContentListener(new SMSReceiver.SMSContentListener() {
@Override
public void receiveContent(StringSMSContent) {
// 此处即为对短信接听内容的具体实现
}
}
上述两段代码就实现了对短信内容的接受以及对内容的处理。其中,第一段代码,即为被观察者,当接收到短信内容时,调用了通知短信更新的接口receiveContent(String SMSContent);而通过该接口,第二段内容即被触发更新,第二段为观察者角色。通过被观察者的更新,而发生相对应的数据更新。
“观察者”模式属于行为型设计模式,更是我们使用十分频繁的一种模式,需要掌握。