概念:本文中的”去除中間人對象”是指把 在中間關聯而不起任何其他作用的類移除,讓有關係的兩個類直接進行交互。
正文:有些時候在我們的代碼會存在一些”幽靈類“,設計模式大師Fowler稱它們爲“中間人”類,“中間人”類除了調用別的對象之外不做任何事情,所以“中間人”類沒有存在的必要,我們可以將它們從代碼中刪除,從而讓交互的兩個類直接關聯。
如下代碼所示,Consumer 類要得到AccountDataProvider 的數據,但中間介入了沒起任何作用的 AccountManager 類來關聯,所以我們應當移除。
using LosTechies.DaysOfRefactoring.PullUpField.After;
namespace LosTechies.DaysOfRefactoring.SampleCode.RemoveMiddleMan.Before
{
public class Consumer
{
public AccountManager AccountManager { get; set; }
public Consumer(AccountManager accountManager)
{
AccountManager = accountManager;
}
public void Get(int id)
{
Account account = AccountManager.GetAccount(id);
}
}
public class AccountManager
{
public AccountDataProvider DataProvider { get; set; }
public AccountManager(AccountDataProvider dataProvider)
{
DataProvider = dataProvider;
}
public Account GetAccount(int id)
{
return DataProvider.GetAccount(id);
}
}
public class AccountDataProvider
{
public Account GetAccount(int id)
{
// get account
}
}
}
重構後的代碼如下所示,Consumer 和AccountDataProvider 直接進行關聯,這樣代碼就簡單了。
using LosTechies.DaysOfRefactoring.PullUpField.After;
namespace LosTechies.DaysOfRefactoring.SampleCode.RemoveMiddleMan.After
{
public class Consumer
{
public AccountDataProvider AccountDataProvider { get; set; }
public Consumer(AccountDataProvider dataProvider)
{
AccountDataProvider = dataProvider;
}
public void Get(int id)
{
Account account = AccountDataProvider.GetAccount(id);
}
}
public class AccountDataProvider
{
public Account GetAccount(int id)
{
// get account
}
}
}
總結: ”去除中間人對象“很多時候都會很有作用,尤其是在誤用設計模式的代碼中最容易見到,設計模式中的適配器模式和代理模式等都用中間的類是兩者進行關聯,這是比較合理的,因爲中間類做了很多事情,而對於沒有任何作用的中間類應該移除。