如果你看到用户向一个对象索求(request)另一个对象,然后再向后者索求另一个对象,然后再索求另一个对象。。。。。。这就是Message Chain。实际代码中你看到的可能是一长串getThis()或一长串临时变量。采取这种方式,意味客户将与查找过程中的航行结构(structure of navigation)紧密耦合。一旦对象间的关系发生任何变化,客户端就不得不作出相应修改。
这时候你应该使用Hide Delegate(157)。你可以在Message Chain的不同位置进行这种重构手法。理论上你可以重构Message Chain上的任何一个对象,但这么做往往会把所有中介对象(intermediate object)都变成Middle Man.通常更好的选择是:先观察Message Chain最终得到的对象是用来干什么的,看看能否以Extract Method(110)把使用该对象的代码提炼到一个独立函数中,再运用Move Method(142)把这个函数推入Message Chain。如果这条链上的某个对象有多位客户打算航行此航线的剩余部分,就加一个函数来做这件事。