Navigator Pattern: 导航者, 一种通信软件报文处理模式
TopLevelPayload* goto_nth_toplevel_payload(Message* message, int nth_toplevel_payload) { TopLevelPayload* addr = message->payload; for(int i = 0; i < nth_toplevel_payload; i++) { addr = (TopLevelPayload*)((char*)addr + sizeof_toplevel_payload(addr)); } return addr;}SecondLevelPayload* goto_nth_secondlevel_payload(TopLevelPayload* top, int nth_secondlevel_payload) { return top->payload + nth_secondlevel_payload;}static int sizeof_toplevel_payload(TopLevelPayload* payload) { return sizeof(TopLevelPayload) + payload->second_level_payload_count * sizeof(SecondLevelPayload);}
这样, 通过报文首地址和goto_nth_toplevel_payload(), goto_nth_secondlevel_payload()两个函数, 客户代码就可以在报文体中任意巡航, 而无需理会其内部表示, 无需涉及易错和晦涩的指针运算. 当报文协议变化时, 我们也只需要修改navigator, 无需修改客户代码.
相关模式
Page Object模式描述了在web应用测试领域针对易变的web页面进行封装的方法, 其中也涉及对页面不同元素的导航. 其解决的主要问题是减少相对频繁的页面变化对测试代码的稳定性造成的冲击, 并更清晰的描述测试意图.