发送方发送数据供接收方处理,很有可能出现这样的情况:有多种类型的消息,接收方根据不同种类的消息有不同的处理方式,假如发送方一股脑儿将这些消息全部塞入channel中,接收方将不知道接收到的消息的类型,也就无法调用相应的处理程序。Datatype Channel正是为了解决这个问题而提出一种模式,也就是根据不同的消息类型创建相应的channel来传输数据,这样一来,发送方知道消息的类型,从而将该类型消息塞入相应的channel之中,接收方知道每条channel中存在的消息的类型,也就清楚自己该调用什么样的程序来处理从相应channel中获取的消息。这有别于普通的消息传送———在发送方和接收方之间建立一条channel用于传输消息。代价当然是需要创建多条channel以建立这样的类型区分。一旦消息类型增多,这样的channel开销还是比较昂贵的。
很显然,为了使接收方能处理从单一channel接收并处理不同类型的消息,我们可以在消息中加入Format Indicator,以区分消息类型。这样一来,接收方首先分析消息类型,然后再调用相关过程处理这条消息。将分析过程抽取出来,使之独立于处理模块,这就衍生出Selective Consumer,Message Dispatcher两种模式。这两种模式有一个共同特点,就是发送方和接收方之间只有一条channel,类型识别模块均内置于接收方的处理模块之中。这两种模式并不维护Datatype Channels,但是可以理解成在接收方处理模块内部的类型识别模块和特定消息处理模块之间建立了逻辑意义上的Datatype Channels。
假如我们仍然希望能够使用Datatype Channels(某种癖好?或者我们希望将接收方的针对消息类型不同的处理模块独立划分出来),但是发送方坚持将所有消息,全部塞入一条channel中。这个时候,可以采用Content-Based Router模式,这样就实现了接收方由单一channel发送消息,通过一个消息路由模块把特定类型的消息塞入相应的channel中,也就在路由模块和接受方维持了Datatype Channel模式。