面向对象7大设计原则(四)------ 接口隔离原则

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

一、什么是接口隔离原则

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

根据接口隔离原则,当一个接口太大时,我们需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干。这里的“接口”往往有两种不同的含义:一种是指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象;另外一种是指某种语言具体的“接口”定义,有严格的定义和结构:

(1)当把“接口”理解成一个类型所提供的所有方法特征的集合的时候,这就是一种逻辑上的概念,接口的划分将直接带来类型的划分。可以把接口理解成角色,一个接口只能代表一个角色,每个角色都有它特定的一个接口,此时,这个原则可以叫做“角色隔离原则”。

(2)如果把“接口”理解成狭义的特定语言的接口,那么接口隔离原则表达的意思是指接口仅仅提供客户端需要的行为,客户端不需要的行为则隐藏起来,应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口。在面向对象编程语言中,实现一个接口就需要实现该接口中定义的所有方法,因此大的总接口使用起来不一定很方便,为了使接口的职责单一,需要将大接口中的方法根据其职责不同分别放在不同的小接口中,以确保每个接口使用起来都较为方便,并都承担某一单一角色。接口应该尽量细化,同时接口中的方法应该尽量少,每个接口中只包含一个客户端(如子模块或业务逻辑类) 所需的方法即可,这种机制也称为“定制服务”,即为不同的客户端提供宽窄不同的接口。

二、实例

有小明和小红两个人,小明喜欢户外运动,小红喜欢室内运动。刚开始我们设计代码想法是把相同功能放在同一个接口里,如:

public interface IHobby {
    //游泳
    void swim();
    //打篮球
    void playBasketball();
    //玩电脑
    void playComputer();
    //看书
    void readBook();
    //看电视
    void watchTV();
    //爬山
    void climb();
    //跑步
    void running();
}

然后小明和小红都实现这个接口:

public class XiaoMing implements IHobby {
    @Override
    public void swim() {
        System.out.println("游泳");
    }

    @Override
    public void playBasketball() {
        System.out.println("打篮球");
    }
    //对小明无用的方法
    @Override
    public void playComputer() {

    }
    //对小明无用的方法
    @Override
    public void readBook() {

    }
    //对小明无用的方法
    @Override
    public void watchTV() {

    }

    @Override
    public void climb() {
        System.out.println("爬山");
    }

    @Override
    public void running() {
        System.out.println("跑步");
    }
}

public class XiaoHong implements IHobby {
    //对小红无用的方法
    @Override
    public void swim() {

    }
    //对小红无用的方法
    @Override
    public void playBasketball() {

    }

    @Override
    public void playComputer() {
        System.out.println("玩电脑");
    }

    @Override
    public void readBook() {
        System.out.println("看书");
    }

    @Override
    public void watchTV() {
        System.out.println("看电视");
    }
    //对小红无用的方法
    @Override
    public void climb() {

    }
    //对小红无用的方法
    @Override
    public void running() {

    }
}

如上所示,小明和小红都在各自内实现了一堆无用的方法。如果小明还喜欢踢足球,那IHobby就得加一个踢足球的方法,XiaoMing和XiaoHong也不得不跟着做更改。因此要讲IHobby按照接口隔离原则进行拆分:

public interface IIndoor {
    //玩电脑
    void playComputer();
    //看书
    void readBook();
    //看电视
    void watchTV();
}
public interface IOutdoor {
    //游泳
    void swim();
    //打篮球
    void playBasketball();
    //爬山
    void climb();
    //跑步
    void running();
}

小明和小红都自己实现自己功能的接口:

public class XiaoHong implements IIndoor {
    @Override
    public void playComputer() {
        System.out.println("玩电脑");
    }

    @Override
    public void readBook() {
        System.out.println("看书");
    }

    @Override
    public void watchTV() {
        System.out.println("看电视");
    }
}
public class MingMing implements IOutdoor {
    @Override
    public void swim() {
        System.out.println("游泳");
    }

    @Override
    public void playBasketball() {
        System.out.println("打篮球");
    }

    @Override
    public void climb() {
        System.out.println("爬山");
    }

    @Override
    public void running() {
        System.out.println("跑步");
    }
}

三、总结

虽然接口隔离原则和单一职责很相似,但是,单一职责注重的是职责,主要是约束类,然后是接口和方法;接口隔离原则注重的是对接口的依赖的隔离,主要约束接口。单一职责原则针对的是程序中的细节,接口隔离原则针对的是抽象。

在使用接口隔离原则时,我们需要注意控制接口的粒度,接口不能太小,如果太小会导致系统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用起来很不方便。一般而言,接口中仅包含为某一类用户定制的方法即可,不应该强迫客户依赖于那些它们不用的方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值