理解:本文中的”去除中间人对象”是指把 在中间关联而不起任何其他作用的类移除,让有关系的两个类直接进行交互。
详解:有些时候在我们的代码会存在一些”幽灵类“,设计模式大师Martin Fowler称它们为“中间人”类,“中间人”类除了调用别的对象之外不做任何事情,所以“中间人”类没有存在的必要,我们可以将它们从代码中删除,从而让交互的两个类直接关联。
如下代码所示,Consumer 类要得到AccountDataProvider 的数据,但中间介入了没起任何作用的 AccountManager 类来关联,所以我们应当移除。
1 public class Consumer 2 { 3 public AccountManager AccountManager { get; set; } 4 5 public Consumer(AccountManager accountManager) 6 { 7 AccountManager = accountManager; 8 } 9 10 public void Get(int id) 11 { 12 Account account = AccountManager.GetAccount(id); 13 } 14 } 15 16 public class AccountManager 17 { 18 public AccountDataProvider DataProvider { get; set; } 19 20 public AccountManager(AccountDataProvider dataProvider) 21 { 22 DataProvider = dataProvider; 23 } 24 25 public Account GetAccount(int id) 26 { 27 return DataProvider.GetAccount(id); 28 } 29 } 30 31 public class AccountDataProvider 32 { 33 public Account GetAccount(int id) 34 { 35 // get account 36 } 37 }
重构后的代码如下所示,Consumer 和AccountDataProvider 直接进行关联,这样代码就简单了。
1 public class Consumer 2 { 3 public AccountDataProvider AccountDataProvider { get; set; } 4 5 public Consumer(AccountDataProvider dataProvider) 6 { 7 AccountDataProvider = dataProvider; 8 } 9 10 public void Get(int id) 11 { 12 Account account = AccountDataProvider.GetAccount(id); 13 } 14 } 15 16 public class AccountDataProvider 17 { 18 public Account GetAccount(int id) 19 { 20 // get account 21 } 22 }