微信中有很多普通消息和事件消息。我们可能要针对一个消息进行处理,而要针对消息的type创建指定的类,感觉用工厂模式还是不方便。~要写很多判断。所以我采取了责任链模式
有点乱~~
看测试代码:
@Test
public void textSimpleChianHandler(){
AbstractNormalHandlerChain simpleHandlerChain = new SimpleHandlerChain();
im.setMsgType("event");
im.setEvent("subscribe");
simpleHandlerChain.process(im);
}
//结果:
//event handler~~
//subscribe handler~~
主要是这个抽象类:这里有一个链首的handler,并且有process方法(入口方法),用来启动这个链
public abstract class AbstractHandlerChain {
// 链首handler
protected AbstractHandler entryHandler;
/**
* 调用链首handler
*/
public void process(InputMessage im) {
entryHandler.handle(im);
}
public AbstractHandler getEntryHandler() {
return entryHandler;
}
/**
* @param entryHandler
* 只有在自己的HandlerChain里才能设置链首
*/
protected void setEntryHandler(AbstractHandler entryHandler) {
this.entryHandler = entryHandler;
}
}
AbstractNormalHandlerChain:聚合了所有基本消息类型,而event也同理,所以还有一个event的链(看我GITHUB吧~~~)
public abstract class AbstractNormalHandlerChain extends AbstractHandlerChain {
protected AbstractHandler eventHandler = new EventHandler();
protected AbstractHandler imageHandler = new ImageHandler();
protected AbstractHandler linkHandler = new LinkHandler();
protected AbstractHandler locationHandler = new LocationHandler();
protected AbstractHandler shortVideoHandler = new ShortVideoHandler();
protected AbstractHandler textHandler = new TextHandler();
protected AbstractHandler videoHandler = new VideoHandler();
protected AbstractHandler voiceHandler = new VoiceHandler();
}
SimpleHandlerChain: 具体类,只需要在构造器中实现自己想要的链接顺序就OK了
public class SimpleHandlerChain extends AbstractNormalHandlerChain {
/**
* 在构造器中链接handler
*/
public SimpleHandlerChain() {
textHandler.setNextHandler(imageHandler);
setEntryHandler(textHandler);
imageHandler.setNextHandler(voiceHandler);
voiceHandler.setNextHandler(eventHandler);
eventHandler.setNextHandler(locationHandler);
locationHandler.setNextHandler(shortVideoHandler);
shortVideoHandler.setNextHandler(linkHandler);
linkHandler.setNextHandler(videoHandler);
}
}
感觉有点乱:看代码吧~~~~
github :https://github.com/VanXD/wechat2/