接口隔离原则原理讲解-coding
我们先看一下他的定义,用多个专门的接口,而不使用单一的子接口,客户端不应该依赖他不需要使用的接口,
那这个定义也比较好理解,在我们后面一起coding的时候也会很容易的理解他,我们接下来看一些需要注意的点,那这个要注意的
点就是,一个类对一个类的依赖应该建立在最小的接口上,也就是说我有一个大接口,里面有很多很多方法,那我们用一个类来实现这个
接口的话,所有的方法都要实现,那这里面所说的类,是一个泛指,例如说一个interface,那他也是一个类,接着来看,建立单一接口,
不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少,那紧接着我们来看一下接口隔离原则中最重要的一个点
那就是适度原则,一定要适度,那我们刚刚也说了,接口中的方法尽量少,但是要有限度,那我们对接口进行细化,
肯定是可以提高程序设计的灵活性,但是如果接口设计的过小,也就是里面的方法过少,就会造成接口数量过多,
提高整个程序设计复杂性,所以一定要适度,那我们接着来看他的优点是什么呢,符合我们常说的高内聚低耦合的
设计思想,从而使得类有很好的可读性,可扩展性和可维护性,那我们平时在设计接口的时候,只要暴露类给需要
调用的方法,他不需要的方法我们得隐藏起来,只要专注的给一个模块提供好,才能建立最小的依赖关系,那这个就
从一定程度上减少耦合,降低依赖关系,减少耦合,提高内聚怎么理解呢,减少对外的交互,是接口中更少的方法去
完成,这个就是高内聚的一个体现,那我们利用接口隔离原则,一定要适度,这里强调一下,一定要适度,那接口设计的
过大或者过小都不太好,所以我们在设计接口的时候,要多花点时间去筹划,才能准确的实现这个原则,那在实际的
开发项目当中,在实现接口隔离原则的时候,我们也要考虑业务模型,包括以后会发生变更的时间,这些还要做一些
预判,所以对于抽象我们的业务模型,是非常重要的,解析来一起来coding
只要实现IAnimalAction,Bird和Dog是平级的
我们来看新的写法,同级别的接口有很多,Dog实现了IEatAnimalAction的eat方法,实现了ISwinAnimalAction的swin方法,
我们的实现类相对于第一种写法显得更为灵活了,同时对接口进行了隔离,因为细粒度是可以组装的,粗粒度是不可以拆分的,
刚刚我们讲了单一职责原则,和接口隔离原则,和那个是不是很像呢,那这里面说明一下,他们的区别,单一职责原则是指类
接口,方法的职责是单一的,强调的是职责,也就是说在一个接口里,只要职责是单一的,有多个方法也可以,有10个方法,
20个方法,吃,对应的有很多吃法,例如游泳可以狗刨,那游泳的方式也有很多,那接口隔离原则注重的是接口,依赖的隔离,
注意我们这几个接口已经隔离开了,单一职责注重的是类,接口,和方法,针对的是程序中的细节,而接口隔离原则,主要约束的
是接口,是针对抽象,针对程序,整体框架的一个构建,这里面我们实际开发中,请注意一些点,接口尽量小没有问题,但是要有
限度,如果太小的话,那接口数量过多,设计也会变得更复杂,所以整体设计原则,包括后面讲的设计模式,其实我们在实际使用的时候,
要选择一定的平衡,另外一个要注意的点,就是提高内聚,减少对外的交互,接口用最少的方法去完成,那利用接口隔离原则还需要
重申一遍,一定要适度,接口设计的过大或者过小,都不好,所以在设计接口的时候,在抽象的时候,只有多花一点时间,去思考,
才能准确的实现这一个原则,另外要强调的一个是,接口是设计时对外部的契约,那我们通过IAnimalAction,实现成三个不同的
AnimalAction,预防外来的一个扩展,提高了我们系统的灵活性,和可维护性,那接口隔离原则,比较简单,希望大家通过这个例子
来体会一下
package com.learn.design.principle.interfacesegregation;
/**
* 动物的一个行为
* 动物有很多的行为
*
* 接口还可以进一步的细化
* 然后通过实现来实现多个接口
* 来进行编写
* 这个就是接口隔离原则的体现
*
*
* @author Leon.Sun
*
*/
public interface IAnimalAction {
/**
* 比如吃
*
*/
void eat();
/**
* 飞
*/
void fly();
/**
* 游泳
*
*/
void swim();
}
package com.learn.design.principle.interfacesegregation;
/**
* 我们写一个Dog
* 来实现IAnimalAction
* 首先狗吃是没有问题的
* 狗的游泳也是没有问题的
* 那狗会飞吗
* 狗不会飞
* 但是我们实现的接口fly
* 是必须得写的
*
* 他可以游泳
* 他也可以吃
* 实现这两个接口
* 我们来看一下
* 那么如果这么写的话
* Dog是不需要写Fly实现的
* 只需要写eat和swin的实现就可以
* 我们来看一下类图
*
*
* @author Leon.Sun
*
*/
public class Dog implements ISwimAnimalAction,IEatAnimalAction {
@Override
public void eat() {
}
@Override
public void swim() {
}
}
package com.learn.design.principle.interfacesegregation;
/**
* Bird实现IAnimalAction
* 那鸟肯定都会吃
* 飞不一定
* 比如鸵鸟就不会飞
* 游泳也不一定
* 有的鸟会游泳
* 有的鸟就不会游泳
* 那例如企鹅
* 企鹅也算鸟类
* 他呢会游泳
* 但是不会飞
* 所以在Bird的实现里面
* 还是有一些方法
* 只能是空的实现放在这里面
* 那我们的实际开发过程中
* 也经常能碰到这样的情况
* 对于一个接口
* 里面实现的东西过多
* 并且是不同类型的
*
*
*
* @author Leon.Sun
*
*/
public class Bird implements IAnimalAction {
@Override
public void eat() {
}
@Override
public void fly() {
}
@Override
public void swim() {
}
}
package com.learn.design.principle.interfacesegregation;
/**
*
* @author Leon.Sun
*
*/
public interface IFlyAnimalAction {
/**
* 有一个方法是fly
*/
void fly();
}
package com.learn.design.principle.interfacesegregation;
/**
*
* @author Leon.Sun
*
*/
public interface IEatAnimalAction {
/**
* 一个吃的方法
*
*/
void eat();
}
package com.learn.design.principle.interfacesegregation;
/**
* 首先它可以游泳
*
* @author Leon.Sun
*
*/
public interface ISwimAnimalAction {
/**
* 他可以游泳
*
*/
void swim();
}