有时候为了使得多人根据同一份协议文档开发顺利,或者实现
UI
和业务逻辑分离,会用到
handler
,使用
handler
可以进行解耦。例如
UI
控制的逻辑可以由
A
来写,然后添加到
handler
列表中,等待业务逻辑通过
handler
管理器,发送一个对应的标记找到它来并传递参数(回调),从而间接性地运行对应的方法。互相不需要知道对方是如何实现的,等待被调用和放心发送自己的结果去让
handler
管理器调用该被调用的东西即可。
这样做也可以避免自己到处写千姿百态而随意的回调使得架构越变越复杂,更可以把通过全局变量加线程轮询该变量这种方法避免掉。
至于我自己的这个东西,想传多参数,最好还是塞个List吧……
但缺点就是浪费了一点CPU时间和内存。
大致架构:
JAVA版本实现:
结构:
package cjz.tools.handlerMsg; import java.util.ArrayList; public class Handler { /**消息队列,存放用户通过接口,自定义实现了的消息对象**/ private static ArrayList<HandlerInterface> handlers = new ArrayList<HandlerInterface>(); /**添加消息接口对象**/ public static void addHandler(HandlerInterface handler){ Handler.handlers.add(handler); } /**移除消息接口对象**/ public static boolean removeHandler(HandlerInterface handler) { try { Handler.handlers.remove(handler); }catch (Exception e) { return false; } return true; } /**发送消息到标记处 * @param MsgFlag 消息对象标记,用来辨别那些消息对象该接收此数据对象**/ public static void sendHandlerMsg(int MsgFlag,Object object) { for(HandlerInterface handler:handlers) { try { if(handler.throwMyMsgFlag() == MsgFlag) { handler.getHandlerMsg(object); } }catch (Exception e) { e.printStackTrace(); } } } }
package cjz.tools.handlerMsg; public interface HandlerInterface { /**请返回你自定义的消息标志,使消息能正确送达**/ public int throwMyMsgFlag(); /**请实现你收到消息后对消息的处理过程**/ public void getHandlerMsg(Object object); }
package cjz.tools.handlerMsgExample; import cjz.tools.handlerMsg.Handler; import cjz.tools.handlerMsg.HandlerInterface; public class TestRead1 { private final static int myMsgFlag1 = 0x01; public TestRead1() { HandlerInterface handler1 = new HandlerInterface() { @Override public int throwMyMsgFlag() { return myMsgFlag1; } @Override public void getHandlerMsg(Object object) { System.out.println("handler1:" + object); } }; Handler.addHandler(handler1); } }
package cjz.tools.handlerMsgExample; import cjz.tools.handlerMsg.Handler; import cjz.tools.handlerMsg.HandlerInterface; public class TestRead2 { private final static int myMsgFlag1 = 0x01; public TestRead2() { HandlerInterface handler1 = new HandlerInterface() { @Override public int throwMyMsgFlag() { return myMsgFlag1; } @Override public void getHandlerMsg(Object object) { System.out.println("handler2:" + object); } }; Handler.addHandler(handler1); } }
package cjz.tools.handlerMsgExample; import cjz.tools.handlerMsg.Handler; import cjz.tools.handlerMsg.HandlerInterface; public class TestRead3 { private final static int myMsgFlag2 = 0x02; public TestRead3() { HandlerInterface handler3 = new HandlerInterface() { @Override public int throwMyMsgFlag() { return myMsgFlag2; } @Override public void getHandlerMsg(Object object) { System.out.println("handler3:" + object); } }; Handler.addHandler(handler3); } }
package cjz.tools.handlerMsgExample; import cjz.tools.handlerMsg.Handler; public class TestWriteThread { public TestWriteThread() { new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 256; i++) { Handler.sendHandlerMsg(0x01, "test handler msg:" + i); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }).start(); } }
package cjz.tools.handlerMsgExample; import cjz.tools.handlerMsg.Handler; public class TestWriteThread2 { public TestWriteThread2() { new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 1024; i++) { Handler.sendHandlerMsg(0x02, "numer:" + i); try { Thread.sleep(200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }).start(); } }
运行效果: