Whatjava
Interface Segregation Principle(ISP):客户端不该该依赖它不须要的接口;类间的依赖关系应该创建在最小的接口上程序员
Why网站
“不该该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。”这个说得很明白了,再通俗点说,不要强迫客户使用它们不用的方法,若是强迫用户使用它们不使用的方法,那么这些客户就会面临因为这些不使用的方法的改变所带来的改变。code
How接口
如今有一个接口,做用是编写一个网站,其中有两个方法ip
interface IWriteWebsite { //实现UI void WriteWebsiteUI(); //实现逻辑代码 void WriteWebsiteLogic(); }
经验丰富的程序员类,能够单独完成开发网站的任务ci
//经验丰富的程序员 class ExperiencedProgrammer : IWriteWebsite { public void WriteWebsiteUI() { Console.WriteLine("实现界面"); } public void WriteWebsiteLogic() { Console.WriteLine("实现后台逻辑"); } }
可是咱们会发现,有一些经验不是那么丰富的程序员只能完成一个方向的工做,多是界面方向也多是后台方向,那么咱们若是实现原有的编写网站的接口,那部分他不会的技能就不能实现,那么这样一来就违反了单一职责原则以及里氏替换原则,因此咱们能够将编写网站的接口拆分红IWriteWebsiteUI及IWriteWebsiteLogic两个接口,这样的话,经验丰富的程序员实现这两个接口,而对应方向的程序员实现各自的接口就能够了。这样在接口的复用上,也达到了想要的效果。开发
编写网站逻辑接口it
interface IWriteWebsiteLogic { void WriteLogic(); }
编写网站界面接口io
interface IWriteWebsiteUI { void WriteUI(); }
编写逻辑的程序员类
class LogicProgrammer : IWriteWebsiteLogic { public void WriteLogic() { Console.WriteLine("实现后台逻辑"); } }
编写界面的程序员类
class UIProgrammer : IWriteWebsiteUI { public void WriteUI() { Console.WriteLine("实现界面"); } }
经验丰富的程序员类
class ExperiencedProgrammer : IWriteWebsiteLogic, IWriteWebsiteUI { public void WriteLogic() { Console.WriteLine("实现后台逻辑"); } public void WriteUI() { Console.WriteLine("实现界面"); } }
上面只是一个简单的示例,其中有不少的东西都没有加入,好比抽象的程序员类,而这个类应该具备可演示的工做结果等等。这里是为了演示一下相关的臃肿接口拆开以后带来的好处。当细粒度减少以后,复用性就提升了;类也不须要实现不合适的接口而形成承担不须要承担的行为,也不存在违反LSP或者SRP。
单一职责原则同接口隔离原则的异同:类似之处都是起到了瘦身的做用,减小耦合性;不一样的地方固然是职责是一种能力,可能能够处理某同样事物须要不少个接口。接口跟职能仍是有差异的。