个人blog 此篇博文地址:http://www.sanyinchenblog.com/?p=174
接口隔离原则:
demo: https://github.com/sanyinchen/UMLDemo 接口的两种类型: (1)实例接口 (2)类接口,使用Interface定义的接口 隔离: (1)客户端不应该依赖它不需要的接口 (2)类间的依赖关系应该建立在最小的接口上 场景描述:你一日在大街上闲着无聊,在大街上喊了一句美女,结果好多女生都回过头注视你。 我们现在给美女下一个定义:
(1)好看的容貌 (2)好的身材 (3)好的气质 但是现在问题来了,只有全部符合这三条的才是美女吗,比如一个女生有很好的气质,但是相貌长相一般,但是她仍然是一个美女,我们把她称之为气:
public class Client { public static void main(String[] args) { // TODO Auto-generated method stub IGoodBodyGril bodyGril = new IGoodBodyGril() { @Override public void niceFigure() { // TODO Auto-generated method stub System.out.println("好的身材!"); } @Override public void goodLooking() { // TODO Auto-generated method stub System.out.println("好的容貌!"); } }; IGreatTemperamentGril greatTemperamentGril = new IGreatTemperamentGril() { @Override public void greatTemperament() { // TODO Auto-generated method stub System.out.println("好的气质!"); } }; Search search = new Search(greatTemperamentGril); search.show(); Search2 search2 = new Search2(bodyGril); search2.show(); } }
以上就是把一个臃肿的接口拆分成两个,让AbstractSearch有两个更为针对性的接口(这一点看起来有点像单一职责,但是范围感觉要比单一职责大的多)。 接口隔离原则的约束规范: (1)接口要尽量小(依据接口隔离原则拆分接口首先必须满足单一职责原则) (2)接口要高内聚(书中解释什么是高内聚举了个很有意思的例子:有一天你告诉你的下属去把奥巴马桌子上XXX文件拿过来,过了几个月,你下属还真把这份文件给你拿过来了。这种不讲任何条件立即执行完成任务的表现就是高内聚的表现。具体到隔离原则就是要求在接口中尽量少的公布public方法,换句话说就是尽量减少接口的数量,好吧,又回到了第一条)
(3)定制服务(只提供访问者需要的方法) (4)接口的设计是有限度的(接口设计的越小,那么系统就越灵活,但相应的来说,系统就变的复杂,所以这个限度要依据项目而定) 接口隔离设计原则: (1)一个接口只服务于一个子模块或者业务逻辑 (2)通过业务逻辑去压缩接口中的public方法 (3)已经被污染的接口尽量去修改,若变更风险大则使用适配器模式进行转化 (4)了解环境,拒绝盲从