接口隔离原则原理讲解-coding

接口隔离原则原理讲解-coding

我们先看一下他的定义,用多个专门的接口,而不使用单一的子接口,客户端不应该依赖他不需要使用的接口,

那这个定义也比较好理解,在我们后面一起coding的时候也会很容易的理解他,我们接下来看一些需要注意的点,那这个要注意的

点就是,一个类对一个类的依赖应该建立在最小的接口上,也就是说我有一个大接口,里面有很多很多方法,那我们用一个类来实现这个

接口的话,所有的方法都要实现,那这里面所说的类,是一个泛指,例如说一个interface,那他也是一个类,接着来看,建立单一接口,

不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少,那紧接着我们来看一下接口隔离原则中最重要的一个点

接口隔离原则原理讲解-coding

那就是适度原则,一定要适度,那我们刚刚也说了,接口中的方法尽量少,但是要有限度,那我们对接口进行细化,

肯定是可以提高程序设计的灵活性,但是如果接口设计的过小,也就是里面的方法过少,就会造成接口数量过多,

提高整个程序设计复杂性,所以一定要适度,那我们接着来看他的优点是什么呢,符合我们常说的高内聚低耦合的

设计思想,从而使得类有很好的可读性,可扩展性和可维护性,那我们平时在设计接口的时候,只要暴露类给需要

调用的方法,他不需要的方法我们得隐藏起来,只要专注的给一个模块提供好,才能建立最小的依赖关系,那这个就

从一定程度上减少耦合,降低依赖关系,减少耦合,提高内聚怎么理解呢,减少对外的交互,是接口中更少的方法去

完成,这个就是高内聚的一个体现,那我们利用接口隔离原则,一定要适度,这里强调一下,一定要适度,那接口设计的

过大或者过小都不太好,所以我们在设计接口的时候,要多花点时间去筹划,才能准确的实现这个原则,那在实际的

开发项目当中,在实现接口隔离原则的时候,我们也要考虑业务模型,包括以后会发生变更的时间,这些还要做一些

预判,所以对于抽象我们的业务模型,是非常重要的,解析来一起来coding

接口隔离原则原理讲解-coding

只要实现IAnimalAction,Bird和Dog是平级的

接口隔离原则原理讲解-coding

我们来看新的写法,同级别的接口有很多,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();
}