04-接口隔离原则(ISP)

时间:2023-03-08 23:58:49
04-接口隔离原则(ISP)

1. 背景

类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类B和类D来说不是最小接口,则类B和类D不得不去实现它们不需要的方法。

2. 定义

一个类对另一个类的依赖应该建立在最小的接口上,不应该依赖他不需要的接口。

3. 解决方案

将臃肿的接口I拆分为独立的几个接口,类A和类C分别于它们需要的接口建立依赖关系,即接口隔离原则。

4. 模拟场景

接口I中有5个方法, 类A通过接口I依赖于类B,但类A只需要方法1、方法2、方法3;类C通过接口I依赖于类D,但类C只需要方法1、方法4、方法5。

以上这种业务场景:我们发现,对类B来说,方法4和方法5不是必须的,但不得不实现;对于类D来说,方法2和方法3不是必须的,但不得不实现,显然不满足接口隔离原则。

解决方案:将接口I拆分成三个接口 I1、I2、I3;I1中有方法1;I2中有方法2、方法3;I3中有方法4、方法5。B实现接口I1和I2,D实现接口I1和I3;这样就满足最小接口依赖了,即满足接口隔离原则了

  注意:为了和上面的代码区分:A用AA表示,B用BB表示,一次类推

  public interface I1
{
void methord1();
}
  public interface I2
{
void methord2();
void methord3();
}
   public interface I3
{
void methord4();
void methord5();
}
  public class BB : I1, I2
{
public void methord1()
{
Console.WriteLine("类BB实现接口I1的方法1");
} public void methord2()
{
Console.WriteLine("类BB实现接口I2的方法2");
} public void methord3()
{
Console.WriteLine("类BB实现接口I2的方法3");
}
}
  public class DD:I1,I3
{
public void methord1()
{
Console.WriteLine("类DD实现接口I1的方法1");
} public void methord4()
{
Console.WriteLine("类DD实现接口I3的方法4");
} public void methord5()
{
Console.WriteLine("类DD实现接口I3的方法5");
}
}
  public class AA
{
public void Depend1(I1 i)
{
i.methord1();
}
public void Depend2(I2 i)
{
i.methord2();
}
public void Depend3(I2 i)
{
i.methord3();
}
}
  public  class CC
{
public void Depend1(I1 i)
{
i.methord1();
}
public void Depend4(I3 i)
{
i.methord4();
}
public void Depend5(I3 i)
{
i.methord5();
}
}
  public static void show2()
{ //解决上述业务场景,使其满足接口隔离原则
//解决方案:将接口I拆分成三个接口 I1、I2、I3;I1中有方法1;I2中有方法2、方法3;I3中有方法4、方法5。B实现接口I1和I2,D实现接口I1和I3;这样就满足最小接口依赖了,
//即满足接口隔离原则了
//注意:为了和上面的代码区分:A用AA表示,B用BB表示,一次类推
AA aa = new AA();
aa.Depend1(new BB());
aa.Depend2(new BB());
aa.Depend3(new BB());
CC cc = new CC();
cc.Depend1(new DD());
cc.Depend4(new DD());
cc.Depend5(new DD()); }

04-接口隔离原则(ISP)