今天给大家分享一下观察者设计模式(监听设计模式),该模式在很多主流得框架、源码中使用率非常高。在分享之前先给大家讲一个我们使用手机的一个场景,我们都用过手机,当我们手机来电话的时候,会有各种复杂的操作,比如会响铃、手机震动、屏幕会亮屏等等,大家有没有考虑过这个场景是怎么实现的呢?其实这个地方就是使用了观察者设计模式。
在上述例子中,如果不使用观察者设计模式,要怎么设计比较合理,任何一种设计模式的出现都有它使用的场景,这都是历经多少前辈的经验总结出来的,观察者设计模式也不例外
观察者模式的应用场景: 1、 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。 2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
定义
观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或 从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各 观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
UML图
观察者设计模式主要包括以下三个部分:
1,事件
2,事件源
3,观察者(监听者)
上述的例子中,事件(来电);事件源(call);观察者(屏幕相应对象、响铃相应对象、震动相应对象等),这些观察者就是订阅了call的状态,当call的状态变成来电时,这些观察者就能收到相应的信息,然后做一些更新的操作。
代码设计
CallObserverable.java
代码语言:javascript复制package mode.observe;
/**
* @author hongtaolong
* 抽象的被观察的接口
*/
public interface CallObserverable {
public void registerObserver(CallStateListener o);//订阅
public void removeObserver(CallStateListener o);//删除订阅
public void notifyObserver();//通知
}
CallStateListener.java
代码语言:javascript复制package mode.observe;
/**
* @author hongtaolong
* call状态监听的接口
*/
public interface CallStateListener {
void update();
}
CallRing.java
代码语言:javascript复制package mode.observe;
/**
* @author hongtaolong
* 响铃相关的类
*/
public class CallRing implements CallStateListener {
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("来电话了,我要响铃了");
}
}
CallScreen.java
代码语言:javascript复制package mode.observe;
/**
* @author hongtaolong
* 响铃相关的类
*/
public class CallScreen implements CallStateListener {
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("来电话了,我要亮屏");
}
}
CallShock.java
代码语言:javascript复制package mode.observe;
/**
* @author hongtaolong
* 震动相关的类
*/
public class CallShock implements CallStateListener {
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("来电话了,我要震动了");
}
}
CallState.java
代码语言:javascript复制package mode.observe;
import java.util.ArrayList;
import java.util.List;
/**
* @author hongtaolong
* call状态类
*/
public class CallState implements CallObserverable{
private int state;//call的状态
private List<CallStateListener> mCallListeners;
public CallState() {
// TODO Auto-generated constructor stub
mCallListeners = new ArrayList<>();
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
//为了方便在这里进行简单的改变call的状态,设定当state = 2表示来电话
if(state == 2) {
notifyObserver();//通知观察者
}
}
@Override
public void registerObserver(CallStateListener o) {
// TODO Auto-generated method stub
mCallListeners.add(o);
}
@Override
public void removeObserver(CallStateListener o) {
// TODO Auto-generated method stub
mCallListeners.remove(o);
}
@Override
public void notifyObserver() {
// TODO Auto-generated method stub
for(CallStateListener listener : mCallListeners) {
listener.update();
}
}
}
CallClient.java
代码语言:javascript复制package mode.observe;
/**
* @author hongtaolong
* 客户端
*/
public class CallClient {
public static void main(String[] args) {
CallStateListener shock = new CallShock();
CallStateListener screen = new CallScreen();
CallStateListener ring = new CallRing();
CallState callState = new CallState();
callState.registerObserver(screen);//screen订阅call的状态
callState.registerObserver(shock);//shock订阅call状态
callState.registerObserver(ring);//ring订阅call状态
callState.setState(2);//模拟2表示来电
}
}
运行结果:
观察者设计模式是不是非常简单,本文如有错误之处,欢迎指出,谢谢!