观察者模式:定义对象间一种一对多的依赖关系。使的每当一个对象状态改变,则所有依赖它的对象都会得到通知。
使用场景:微信公众号,即时通讯中的消息收发等等。
现在用一个做即时通讯的用到最主要的一部分来举例,对于消息的接收。
定义被观察者接口:
/**
* 消息被观察者
* @author PC
*
*/
public interface MessageReceiver {
/**
* 注册观察者
* @param watcher
*/
public void addObserver(MessageWatcher watcher);
/**
* 移除观察者
* @param watcher
*/
public void removeObserver(MessageWatcher watcher);
/**
* 通知所有观察者
*/
public void notifyObversers();
}
定义观察者的接口:
/**
* 观察者接口
* @author PC
*
*/
public interface MessageWatcher {
/**
* 用来收到改变通知
* @param message
*/
public void update(Message message);
}
定义消息实体:
/**
* 消息
* @author PC
*
*/
public abstract class Message {
}
好了,所有的抽象架构已经写完了,因为我们要处理的是服务器端推送过来的消息,所有有一个消息抽象类。
实现一个消息接收者(一个具体被观察者,相当于一个微信公众号):
/**
* 消息处理者
* @author PC
*
*/
public class MessageHandler implements MessageReceiver{
private List<MessageWatcher> list = new ArrayList<MessageWatcher>();
private Message message;
public void addObserver(MessageWatcher watcher) {
list.add(watcher);
}
public void removeObserver(MessageWatcher watcher) {
list.remove(watcher);
}
public void notifyObversers() {
for (MessageWatcher watcher : list) {
watcher.update(message);
}
}
/**
* 自定义方法,用来接收消息
* @param message
*/
public void hanleMessage(Message message){
this.message = message;
notifyObversers();
}
}
要点:要持有一个保存观察者的集合。一般会自定义一个方法用来供其他功能调用并传入消息。
好的,现在就需要实现几个具体的观察者了,假设现在我们在微信的一个和某人聊天的页面:
/**
* 模拟一个activity
* @author PC
*
*/
public class Activity {
/**
* 匿名内部类
*/
private MessageWatcher messageWatcher = new MessageWatcher() {
public void update(Message message) {
//更新消息列表
System.out.println("收到消息..."+message);
}
};
/**
* 模拟onCreate方法
*/
public void onCreate(){
//注册观察
MessageHandler.getInsance().addObserver(messageWatcher);
}
/**
* 模拟onDestory方法
*/
public void onDestory(){
//解注册
MessageHandler.getInsance().removeObserver(messageWatcher);
}
}
整个消息架构已经写完,写一个调用段的实现,在真正的app中一定是在receiver中收到服务端发来的消息,然后主动去调MessageHandler.handMessage。
/**
* 模拟一个receiver收到消息
* @author PC
*
*/
public class ReceiverClient {
public static void main(String[] args) {
//模拟已经有一个Activity存活
Activity activity = new Activity();
//模拟onCreate被回调
activity.onCreate();
//Message也用了匿名内部类的,真是肯定有具体实现类,我这里懒得写了。
MessageHandler.getInsance().hanleMessage(new Message() {});
//模拟onDestory被回调
activity.onDestory();
}
}
这个时候,注册了的页面就都会收到消息:
收到消息...Observable.ReceiverClient$1@1db9742
真的,即时通讯关于消息的接收处理架构就是这样写的,如果需要些即时通讯功能的伙伴们可以现学设计模式,现去实践使用。