提醒(来自wiki):
接口隔离原则(ISP)指出,不应强制客户端依赖于其未使用的方法。
现在看看我的示例。
这是我的可变实体。它从某处进行编辑,并能够通过只读接口通知更改:
interface ICounter
{
event Action<int> NewNumber;
}
class Counter : ICounter
{
public event Action<int> NewNumber;
int number = 0;
public void IncrementAndSend(int x)
{
number += x;
if (NewNumber != null) NewNumber(number);
}
}
这是使用它的传输层类。看一下两种注入的变量(Attach_1
和Attach_2
)以及我的假设:
class OneToManyRouter
{
IEnumerable<Counter> _destinations;
public OneToManyRouter(IEnumerable<Counter> destinations)
{
_destinations = destinations;
}
// 1
public void Attach_1(ICounter source)
{
source.NewNumber += (n) =>
{
foreach (var dest in _destinations) dest.IncrementAndSend(n);
};
}
// 2
public void Attach_2(Counter source)
{
source.NewNumber += (n) =>
{
foreach (var dest in _destinations) dest.IncrementAndSend(n);
};
}
}
- ISP关注的是真实对象。您不应该使用“过多”的引用传入参数。
- ISP关注的是类。如果您的类已经在某个地方使用了完整接口,则无需在特定方法中限制引用类型。
ICounter
接口在此示例中是过度的。 - 从SOLID原则的角度来看,这种架构完全错误(那为什么呢?)。