美文网首页框架原理设计模式
面向对象设计--接口隔离原则

面向对象设计--接口隔离原则

作者: NealLemon | 来源:发表于2019-03-01 19:17 被阅读41次

定义

用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。

  • 一个类对一个类的依赖应该建立在最小的接口上
  • 建立单一接口,不要建立庞大臃肿的接口
  • 尽量细化接口,接口中的方法尽量少
  • 注意适度原则,一定要适度细化接口

代码理解

场景

我们假设有这么一个场景,有一批文件需要你处理,文件格式有 txt,csv,xls,xlsx等,有的是让你格式化数据并导出,有的是让你清洗数据并入库。让你用JAVA实现这个处理场景。

错误实现

1.按照正常来说我们会定义处理文件的接口。

/**
 * @InterfaceName IFileHandler
 * @Description 文件处理接口
 * @Author Neal
 * @Date 2019/2/28 19:41
 * @Version 1.0
 */
public interface IFileHandler {
    /**
     * 读取文件
     */
    void readFile();

    /**
     * 处理数据
     */
    void handlerData();

    /**
     * 入库
     */
    void database();

    /**
     * 导出
     */
    void export();
}

乍眼一看,恩~我们接口定义的很完美,把所有场景中的所有需求都实现了。

但是呢,我们会有这种情况,假如处理txt文件时,让你格式化数据然后到处excel格式的文件(xls,xlsx),处理csv数据时,会让你清洗数据然后入库。那么我们在这个接口的基础上需要怎么做呢?

2.创建txt处理类

/**
 * @ClassName TxtHandler
 * @Description 处理txt文件的类
 * @Author Neal
 * @Date 2019/2/28 19:45
 * @Version 1.0
 */
public class TxtHandler implements IFileHandler {

    public void readFile() {
        System.out.println("读取txt文件");
    }

    public void handlerData() {
        System.out.println("格式化数据");
    }

    public void database() {
        //不做任何操作
    }

    public void export() {
        System.out.println("导出excel");
    }
}

3.创建csv处理类

/**
 * @ClassName TxtHandler
 * @Description 处理CSV文件的类
 * @Author Neal
 * @Date 2019/2/28 19:45
 * @Version 1.0
 */
public class CsvHandler implements IFileHandler {

    public void readFile() {
        System.out.println("读取csv文件");
    }

    public void handlerData() {
        System.out.println("清洗数据");
    }

    public void database() {

        System.out.println("数据导入数据库");
    }

    public void export() {
        //不做任何操作

    }
}

我们来看一下类图

interfaceisolation类图1.png

虽然我们都继承了IFileHandler接口,但是我们看到在处理不同文件的时候,有其他接口根本没有用上,但是也暴露给了外面,这样会造成方法冗余。不符合接口隔离原则。

正确实现

1.定义三个接口,分别是 处理文件接口(IFileHandler),数据导出接口(IDataExport),数据入库接口(IDataIntoDataBase)。

IFileHandler:

/**
 * @InterfaceName IFileHandler
 * @Description 文件处理接口
 * @Author Neal
 * @Date 2019/2/28 19:41
 * @Version 1.0
 */
public interface IFileHandler {
    /**
     * 读取文件
     */
    void readFile();

    /**
     * 处理数据
     */
    void handlerData();

}

IDataExport:

/**
 * @InterfaceName IDataExport
 * @Description 数据导出接口
 * @Author Neal
 * @Date 2019/2/28 19:55
 * @Version 1.0
 */
public interface IDataExport {

    /**
     * 导出
     */
    void export();
}

IDataIntoDataBase:

/**
 * @InterfaceName IDataIntoDataBase
 * @Description 数据入库接口
 * @Author Neal
 * @Date 2019/2/28 19:56
 * @Version 1.0
 */
public interface IDataIntoDataBase {

    /**
     * 入库
     */
    void database();

}

2.创建txt处理类,实现文件处理接口和数据导出接口.

/**
 * @ClassName TxtHandler
 * @Description 处理txt文件的类
 * @Author Neal
 * @Date 2019/2/28 19:45
 * @Version 1.0
 */
public class TxtHandler implements IFileHandler,IDataExport {

    public void readFile() {
        System.out.println("读取txt文件");
    }

    public void handlerData() {
        System.out.println("格式化数据");
    }

    public void export() {
        System.out.println("导出excel");
    }
}

3.创建csv处理类,实现文件处理接口,数据入库接口

/**
 * @ClassName TxtHandler
 * @Description 处理CSV文件的类
 * @Author Neal
 * @Date 2019/2/28 19:45
 * @Version 1.0
 */
public class CsvHandler implements IFileHandler,IDataIntoDataBase {

    public void readFile() {
        System.out.println("读取csv文件");
    }

    public void handlerData() {
        System.out.println("清洗数据");
    }

    public void database() {
        System.out.println("数据入库");
    }
}

这种实现就比较符合接口隔离原则,将接口尽量细化,因为细粒度我们可以进行组装而粗粒度我们无法拆分。针对不同的操作,对应实现相应的接口,提高扩展性。

我们再来看一下类图就更明显了。

interfaceisolation类图2.png

我们可以看到虽然我们定义了三个接口,但是我们细化了接口,所以可以是实现类进行灵活组装。

单一职责原则和接口隔离原则的区别

单一职责原则 接口隔离原则
特性 类,接口,方法的职责是单一的,强调职责,也就是在一个类中,只要职责是单一的,有多个方法也没关系。 对接口依赖的隔离
约束 约束的是类,接口,方法,针对程序中的实现和细节。 针对抽象,针对程序整体框架的约束。

总结

虽然接口隔离原则是尽量让接口细化,但是我们一定要适度,不要盲目的增多接口,徒增麻烦,所以在程序设计的时候一定要做全面的考量和细化。

相关文章

  • 面试题

    1>面向对象设计原则 单一职责原则,开闭原则,依赖倒置原则(面向接口编程),迪米特原则,里氏替换原则,接口隔离原则...

  • 设计模式的设计原则

    设计模式的设计原则 面向对象五大设计原则 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 开闭原则 设计模...

  • 【code_hyy_基础】面向对象设计原则

    单一职责原则,开闭原则,依赖倒置原则(面向接口编程),里氏替换原则,接口隔离原则。 面相对象设计的概念大家也都知道...

  • [书摘]《敏捷软件开发: 原则、模式与实践》第一部分:敏捷开发

    面向对象设计的原则 单一职责 开放-封闭 Liskov替换原则 依赖倒置原则 接口隔离原则 重用发布等价原则 共同...

  • OOP之「SOLID」

    SOLID 面向对象设计原则 英文简写名称SRP单一职责原则OCP开放封闭原则LSP里氏替换原则ISP接口隔离原则...

  • 面向对象设计--接口隔离原则

    定义 用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。 一个类对一个类的依赖应该建立在最小...

  • 面向对象六大原则

    在 程序设计领域, SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)指代了面向对象编程和面向对象设...

  • 设计模式之单例模式

    引言-面向对象设计原则 单一职责原则 开闭原则 里氏替换原则 接口隔离原则 依赖倒置原则 迪米特原则 什么是单例模...

  • 面向对象设计

    SOLID (面向对象设计) 在程序设计领域, SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)是...

  • 面向对象设计原则

    常用的面向对象设计原则包括7个,分别是单一职责原则、开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、合成复用原...

网友评论

    本文标题:面向对象设计--接口隔离原则

    本文链接:https://www.haomeiwen.com/subject/ykakuqtx.html