观察者模式:定义对象间一种一对多的依赖关系。使的每当一个对象状态改变,则所有依赖它的对象都会得到通知。
使用场景:微信公众号,即时通讯中的消息收发等等。
现在用一个做即时通讯的用到最主要的一部分来举例,对于消息的接收。
定义被观察者接口:
/** * 消息被观察者 * @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 真的,即时通讯关于消息的接收处理架构就是这样写的,如果需要些即时通讯功能的伙伴们可以现学设计模式,现去实践使用。