设计模式七大原则之接口隔离原则
接口隔离原则:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
接口隔离不应该继承臃肿的接口,只依赖需要的接口,接口必须实现单一职责原则,
举个简单的例子:
1 public class B : A 2 { 3 public void Method1() 4 { 5 Console.WriteLine("需要用到方法1"); 6 } 7 8 public void Method2() 9 { 10 throw new NotImplementedException(); 11 } 12 13 public void Method3() 14 { 15 Console.WriteLine("需要用到方法3"); 16 } 17 18 public void Method4() 19 { 20 Console.WriteLine("需要用到方法4"); 21 } 22 23 public void Method5() 24 { 25 throw new NotImplementedException(); 26 } 27 } 28 29 public class C : A 30 { 31 public void Method1() 32 { 33 Console.WriteLine("需要用到方法1"); 34 } 35 36 public void Method2() 37 { 38 Console.WriteLine("需要用到方法2"); 39 } 40 41 public void Method3() 42 { 43 throw new NotImplementedException(); 44 } 45 46 public void Method4() 47 { 48 throw new NotImplementedException(); 49 } 50 51 public void Method5() 52 { 53 Console.WriteLine("需要用到方法5"); 54 } 55 } 56 57 58 59 public interface A 60 { 61 void Method1(); 62 void Method2(); 63 void Method3(); 64 65 void Method4(); 66 void Method5(); 67 68 }
从上面的例子我们可以看到,B需要用到A接口的Method1,Method3,Method4方法,C需要用到A接口的Method1,Method2,Method5方法,B和C类继承的A接口都有不需要用到的接口方法,造成臃肿。
根据接口隔离原则,当一个接口太大时,需要将它分割成一些更细小的接口,使用该接口的客户端仅需制定与之相关的方法就可以了。每一个接口应该承担一种相对独立的角色。这里的接口有两种不同的含义:一种是指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象;另一种是指某种语言具体的接口定义,有严格的定义和结构,比如Java语言中的interface。对于这两种不同的含义,ISP的表达方式以及含义都有所不同。
我们来对上面的例子通过实现接口隔离原则进行二次改造:
1 public class B : A1 2 { 3 public void Method1() 4 { 5 Console.WriteLine("需要用到方法1"); 6 } 7 8 public void Method3() 9 { 10 Console.WriteLine("需要用到方法3"); 11 } 12 13 public void Method4() 14 { 15 Console.WriteLine("需要用到方法4"); 16 } 17 18 } 19 20 public class C : A2 21 { 22 public void Method1() 23 { 24 Console.WriteLine("需要用到方法1"); 25 } 26 27 public void Method2() 28 { 29 Console.WriteLine("需要用到方法2"); 30 } 31 32 public void Method5() 33 { 34 Console.WriteLine("需要用到方法5"); 35 } 36 } 37 38 39 40 public interface A 41 { 42 void Method1(); 43 44 } 45 46 public interface A1:A 47 { 48 void Method3(); 49 void Method4(); 50 } 51 52 53 public interface A2 : A 54 { 55 void Method2(); 56 void Method5(); 57 }