代码设计思路是先构建一个树,采用多态实现调用数据编码,data = component.getDataFromBuffer(ioBuffer),过程是这样的,先构建两个树,运动树和血压树,也就是filter,比如ASportsComponent的nextfilter就是ABPComponent,因为是针对同时解析多个设备,因此需要一个树一个进行迭代,所有才有个代码nextFilter.messageReceived(session, data);
但是进入一个运动树之后的component.getDataFromBuffer(ioBuffer)解析中就是命中一个具体的包进行解析,此时转换为data就是一个包的Java bean。
代码实现:
- 先构建多个树,并遍历这个树
PackageData data = null;
//1.判断message是字节流还是JAVA对象PackageData
// 比如:登录包被解析后,message换为LoginPacket,这个时候进入if(data == null),此时的nextFilter是ABPComponent,但是没有内容结束程序。
if(message instanceof IoBuffer)
{
IoBuffer ioBuffer = (IoBuffer)message;
ioBuffer.setAutoExpand(true);
data = component.getDataFromBuffer(ioBuffer);
}
if(data == null){
//2.Filter就是ASportsComponent,ABPComponent,因为ABPComponent的nextfilter=null,结束程序.
//登录包过来后,IoFilterAdapter的messageReceived方法,执行nextFilter.messageReceived(session, data)之后,递归进入packageHandle,在下面方法结束程序
nextFilter.messageReceived(session, message);
}else{
nextFilter.messageReceived(session, data);
}
- 下面是匹配一个树的某一个节点,比如匹配ASportsComponent的某一个节点。
public PackageData getDataFromBuffer(IoBuffer buffer) {
return createTreeData(buffer);
}
private PackageData createTreeData(IoBuffer buffer) {
System.out.println(list.size());
// 没有子节点,该节点为叶子节点,直接生成data
if (list.size() == 0) {
return generateRealPackageData(buffer);
}
// 非叶子节点,调用叶子节点的方法生成data
Iterator<Component> iterator = list.iterator();
while (iterator.hasNext()) {
PacketFilterComponent filter = (PacketFilterComponent) iterator
.next();
if (filter.check(buffer)){
return filter.getDataFromBuffer(buffer);
}
}
return null;
}