接口隔离原则

举报
i进击的攻城狮 发表于 2022/06/27 00:17:27 2022/06/27
【摘要】 接口隔离原则(Interface Segregation Principle),简称ISP,定义客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。以上就是接口隔离原则的定义,换句简单的话来说,就是一个类,去实现一个接口的时候,不要去实现这个类根本不需要的方法。案例:假如一个厂家要生产一个电饭煲,在我们的认知中电饭煲有什么功能,比如说,电饭煲有煮饭模式、有煮粥模式、...

接口隔离原则(Interface Segregation Principle),简称ISP,定义

客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。

以上就是接口隔离原则的定义,换句简单的话来说,就是一个类,去实现一个接口的时候,不要去实现这个类根本不需要的方法。

案例:
假如一个厂家要生产一个电饭煲,在我们的认知中电饭煲有什么功能,比如说,电饭煲有煮饭模式、有煮粥模式、煲汤模式,当然不同的电饭煲根据它不同的价格,它们拥有的功能也大不相同。
现在有两款电饭煲,一款可以煮饭、煮粥,一款可以煮饭和煲汤,那用UML类图应该如何表示
在这里插入图片描述
看类图,因为电饭煲的接口,已经把所有电饭煲的功能都已经定义了,如果一个电饭煲要生产,那就去继承电饭煲的接口,但是这个电饭煲可能没有某些功能,比如JavaCooker只有煮饭和煮粥的功能,不能煮汤,但是他继承Cooker接口,必须把煮汤的接口也实现,那怎么办?返回null,如下

public interface Cooker {

    void cookRice();

    void cookPorridge();

    void cookSoup();

}


public class JavaCooker implements Cooker {
    @Override
    public void cookRice() {
        System.out.println("使用JavaCooker煮饭");
    }

    @Override
    public void cookPorridge() {
        System.out.println("使用JavaCooker煮粥");
    }

    @Override
    public void cookSoup() {

    }
}


public class PyCooker implements Cooker{
    @Override
    public void cookRice() {
        System.out.println("使用PyCooker煮饭");
    }

    @Override
    public void cookPorridge() {
        
    }

    @Override
    public void cookSoup() {
        System.out.println("使用PyCooker煮汤");
    }
}

上面这种设计,就是和接口隔离相违背的,接口隔离原则规定,一个类如果去继承一个接口,那这些接口应该都是应该去实现的,而不是空着或者返回null,这样的写法,会在父类调用时,可能会调用到为空的子类,造成不可估计的后果。

那应该怎么去改造?
类图如下:
在这里插入图片描述
把应该电饭煲,所有功能,定义到一个接口,如果一个类需要什么功能,就去继承对应的接口,实现对应的方法。

接口隔离原则的意义:

接口隔离原则是为了避免接口的臃肿,如果把所有功能都集中到一个接口当中,随着产品功能不停的增加,接口内的功能也在增加,接口将会越来越臃肿,增加一个功能,每个实现这个接口的子类都得修改。

“接口隔离”其实就是定制化服务设计的原则。使用接口的多重继承实现对不同的接口的组合,从而对外提供组合功能—达到“按需提供服务”。 接口即要拆,但也不能拆得太细,这就得有个标准,这就是高内聚。接口应该具备一些基本的功能,能独一完成一个基本的任务。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。