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表示,一次类推

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

 

posted @ 2017-07-04 19:40  Yaopengfei  阅读(396)  评论(0编辑  收藏  举报