设计模式-观察者模式,以及如何使用观察者来为app实现即时通讯功能

    xiaoxiao2021-03-25  133

    观察者模式:定义对象间一种一对多的依赖关系。使的每当一个对象状态改变,则所有依赖它的对象都会得到通知。

    使用场景:微信公众号,即时通讯中的消息收发等等。

    现在用一个做即时通讯的用到最主要的一部分来举例,对于消息的接收。

    定义被观察者接口:

    /** * 消息被观察者 * @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 真的,即时通讯关于消息的接收处理架构就是这样写的,如果需要些即时通讯功能的伙伴们可以现学设计模式,现去实践使用。

    转载请注明原文地址: https://ju.6miu.com/read-10348.html

    最新回复(0)