利用单例+观察者设计一个简易的分发/订阅消息机制
来源:互联网 发布:qq农场辅助软件 编辑:程序博客网 时间:2024/06/05 00:59
项目地址
GitHub: https://github.com/AlionSSS/MyNotifier
你可能需要知道
- 单例设计模式
- 观察者设计模式
- 熟悉HashMap、HashSet、Interface
使用示例
- 按value注册观察者
MyNotify.getNotifier().registerObserver("Chinese", new EventObserver() { @Override public void onEvent(Object info) { System.out.println("info = " + info); } });
- 按value分发消息
MyNotify.getNotifier().notify("Chinese", "你好");
源代码
- Event 发生接口
/** * Event 发生接口 * * @author ALion * @version 2017/7/13 1:30 */public interface EventObserver { void onEvent(Object info);}
- Notifier 功能接口
/** * Notifier 功能接口 * * @author ALion * @version 2017/7/13 1:29 */public interface MyNotifier { /** * 注册观察者 * * @param key 用于标识observer,不能为null * @param observer 注册对应的observer接口,不能为null */ void registerObserver(String key, EventObserver observer); /** * 注销观察者 * * @param observer 注销对应的observer接口,不能为null */ void unRegisterObserver(EventObserver observer); /** * 注销观察者 * * @param key 按key值注销,不能为null */ void unRegisterObserver(String key); /** * 注销所有观察者 */ void unRegisterAll(); /** * 按key通知发生变化 * * @param key 按key值通知对应的observer,不能为null * @param info 传递的信息 */ void notify(String key, Object info); /** * 通知所有observer * * @param info 传递的信息 */ void notifyAll(Object info);}
- 消息分发 具体实现类
/** * 消息分发 具体实现类 * * @author ALion * @version 2017/6/21 18:29 */public class MyNotify implements MyNotifier { private static class Inner { private static MyNotifier instance = new MyNotify(); } public static MyNotifier getNotifier() { return Inner.instance; } private MyNotify() { mObservers = new HashMap<>(); } /** * 观察者集合 * 注: key的String类型可以根据个人喜好修改为Integer */ private static HashMap<String, HashSet<EventObserver>> mObservers; @Override public void registerObserver(String key, EventObserver observer) { checkObserver(observer); checkKey(key); HashSet<EventObserver> set = mObservers.get(key); if (set == null) { set = new HashSet<>(); } set.add(observer); mObservers.put(key, set); } @Override public void unRegisterObserver(EventObserver observer) { checkObserver(observer); for (Map.Entry<String, HashSet<EventObserver>> entry : mObservers.entrySet()) { HashSet<EventObserver> set = entry.getValue(); if (set.contains(observer)) { set.remove(observer); break; } } } @Override public void unRegisterObserver(String key) { checkKey(key); mObservers.remove(key); } @Override public void unRegisterAll() { mObservers.clear(); } @Override public void notify(String key, Object info) { checkKey(key); if (mObservers.containsKey(key)) { HashSet<EventObserver> set = mObservers.get(key); for (EventObserver observer : set) { observer.onEvent(info); } } } @Override public void notifyAll(Object info) { for (Map.Entry<String, HashSet<EventObserver>> entry : mObservers.entrySet()) { for (EventObserver observer : entry.getValue()) { observer.onEvent(info); } } } private void checkObserver(EventObserver observer) { if (observer == null) { throw new IllegalArgumentException("observer should not be null!"); } } private void checkKey(String key) { if (key == null) { throw new IllegalArgumentException("key should not be null!"); } }}
测试一下
public class Main { public static void main(String[] args) { MyNotifier notifier = MyNotify.getNotifier(); notifier.registerObserver("China", new EventObserver() { @Override public void onEvent(Object info) { System.out.println("info = " + info); } }); notifier.registerObserver("China", new EventObserver() { @Override public void onEvent(Object info) { System.out.println("info = " + info); } }); notifier.registerObserver("American", new EventObserver() { @Override public void onEvent(Object info) { System.out.println("info = " + info); } }); new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(3000); MyNotifier notifier = MyNotify.getNotifier(); notifier.notify("China", "你好1"); Thread.sleep(3000); notifier.notify("American", "hello"); Thread.sleep(10000); notifier.notify("China", "你好2"); notifier.notify("American", "hello2"); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); for (int i = 0; i < 99; i++) { try { Thread.sleep(500); System.out.println("MainThread ---> " + i); if (i == 20) { System.out.println("注销掉China"); MyNotify.getNotifier().unRegisterObserver("China"); } } catch (InterruptedException e) { e.printStackTrace(); } } }}
阅读全文
1 0
- 利用单例+观察者设计一个简易的分发/订阅消息机制
- 利用单例+观察者设计一个简易的分发/订阅消息机制
- java设计模式-观察者模式(广播机制,消息订阅)
- cocos2dx 3.2 新的事件分发机制 (观察者/订阅者模式)
- 观察者模式:消息的发布与订阅
- 利用JavaFX设计一个简易的时钟
- 项目中用到的一个消息分发机制
- 利用观察者模式(发布/订阅模式)制作一个“代替”广播的通知类
- Kafka 消息订阅与分发
- Android中利用Handler实现消息的分发机制(零)
- Android中利用Handler实现消息的分发机制(一)
- Android中利用Handler实现消息的分发机制(二)
- Android中利用Handler实现消息的分发机制(三)
- 第一部分 Android中利用Handler实现消息的分发机制
- 第二部分 Android中利用Handler实现消息的分发机制
- 第三部分 Android中利用Handler实现消息的分发机制
- 第四部分 Android中利用Handler实现消息的分发机制
- 【GOF23设计模式】_观察者模式_广播机制_消息订阅_网络游戏对战原理_自带类与接口JAVA251-252
- Hello world!
- 欢迎使用CSDN-markdown编辑器
- RaspberryPi实验
- caffe学习系列2—步骤记录
- 基于树莓派的apache2服务器搭建
- 利用单例+观察者设计一个简易的分发/订阅消息机制
- GA--sentence match
- Ubuntu14.04安装搜狗输入法
- 欢迎使用CSDN-markdown编辑器
- Java内部类详解
- Redis
- MySQL中utf8和utf8mb4的区别
- phpstrom下断点调试代码
- extern的用法