如果你看到用戶向一個對象索求(request)另一個對象,然后再向后者索求另一個對象,然后再索求另一個對象。。。。。。這就是Message Chain。實際代碼中你看到的可能是一長串getThis()或一長串臨時變量。采取這種方式,意味客戶將與查找過程中的航行結(jié)構(gòu)(structure of navigation)緊密耦合。一旦對象間的關(guān)系發(fā)生任何變化,客戶端就不得不作出相應(yīng)修改。
這時候你應(yīng)該使用Hide Delegate(157)。你可以在Message Chain的不同位置進(jìn)行這種重構(gòu)手法。理論上你可以重構(gòu)Message Chain上的任何一個對象,但這么做往往會把所有中介對象(intermediate object)都變成Middle Man.通常更好的選擇是:先觀察Message Chain最終得到的對象是用來干什么的,看看能否以Extract Method(110)把使用該對象的代碼提煉到一個獨(dú)立函數(shù)中,再運(yùn)用Move Method(142)把這個函數(shù)推入Message Chain。如果這條鏈上的某個對象有多位客戶打算航行此航線的剩余部分,就加一個函數(shù)來做這件事。