设计模式设计原则之接口隔离原则

135 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

简介

接口隔离的原则定义是:

1、一个类不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上

2、一个类对另外一个类的依赖性应当是建立在最小的接口上的

相对其他原则,接口隔离原则从定义上看就比较好理解,咱们直接上案例。

案例

我们一般情况下使用SpringBoot开发常规应用,会对代码进行Controller、Service、Mapper三层,一般在Service业务层我们会定义一个Service,一个对Service的实现供Controller层调用。

如UserService和UserServiceImpl,通常我们会将有关User操作和查询的业务方法都写在这个UserService里,然后通过注入UserMapper和其他Mapper配合来实现相关业务逻辑。如下:

public interface UserService {

    /**
     * 获取单个用户
     * @return
     */
    User getOneUser();

    /**
     * 新增用户
     * @return
     */
    Long addUser();

    /**
     * 修改用户
     * @return
     */
    Integer updateUser();

    /**
     * 删除用户
     * @return
     */
    Integer deleteUser();

    /**
     * 获取用户列表
     * @return
     */
    List<User> getUserList();

    /**
     * 后管分页获取用户
     * @return
     */
    Page<User> getUserPageForBackend();

    /**
     * APP端分页获取用户
     * @return
     */
    Page<User> getUserPageForApp();

    /**
     * 导出用户到excel
     * @return
     */
    List<User> exportUserToExcel();

    /**
     * 导出用户到txt
     * @return
     */
    List<User> exportUserToTxt();

    /**
     * json格式导出用户
     * @return
     */
    List<User> exportUserToJson();
}

UserServiceImpl类实现上面的UserService的所有方法,在此就不贴代码了。

从上面的代码能看出,我们将所有和User相关的各种方法放在了UserService里,在我们只是写了方法的定义的情况下,这个类已经显得十分臃肿,要是我们后续在各个方法里在加上业务逻辑,那这个类看起来就非常不整洁了。各个方法之间耦合太紧密,比较难维护。这个一个典型的违背接口隔离原则的模式。

按照接口给力原则,我们可以将有关User的各个业务方法进行分类,如增删改的作为一个UserService,用户信息查询的定义为UserQueryService,导出相关的则定义一个UserExportService。。。登录就只依赖登录的接口,导出只依赖导出的接口等等。

1、用户增删改接口

public interface UserService {

    /**
     * 新增用户
     * @return
     */
    Long addUser();

    /**
     * 修改用户
     * @return
     */
    Integer updateUser();

    /**
     * 删除用户
     * @return
     */
    Integer deleteUser();

}

2、用户查询接口

public interface UserQueryService {

    /**
     * 获取单个用户
     * @return
     */
    User getOneUser();
    /**
     * 获取用户列表
     * @return
     */
    List<User> getUserList();

    /**
     * 后管分页获取用户
     * @return
     */
    Page<User> getUserPageForBackend();

    /**
     * APP端分页获取用户
     * @return
     */
    Page<User> getUserPageForApp();

}

3、用户导出相关接口

public interface UserExportService {
    /**
     * 导出用户到excel
     * @return
     */
    List<User> exportUserToExcel();
    /**
     * 导出用户到txt
     * @return
     */
    List<User> exportUserToTxt();
    /**
     * json格式导出用户
     * @return
     */
    List<User> exportUserToJson();
}

重构之后每个接口都承担自己范围的的功能与职责,通过名字就能很清晰地明白这个类是功能是什么,而且灵活性很高,使用起来很方便,每个接口中都只包含和自己业务相关的方法,不会存在和自己无关的方法,达到了高内聚、松耦合的效果。

总结

此原则的含义也比较好理解,相信大家通过这个例子应该能在一定程度上对接口隔离有些清晰了。当然我们在实战中对接口隔离原则并不是要生硬地套用,在有些情况下我们要控制好接口的颗粒度,不能太大也不能太小,否则接口太多也会造成泛滥,给后续维护带来不便,这就违背了我们接口隔离原则的初衷了。

至此,咱们设计模式的六大设计原则我们就全部梳理了一遍,我觉得我自己对设计模式的理念还是有了更深的理解的,后续我们将真正开始23个设计模式的学习和回顾。