《设计模式》——接口隔离原则

1、什么是接口隔离原则?

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

  • 使用多个专门的接口比使用单一的总接口要好。
  • 一个类对另外一个类的依赖性应当是建立在最小的接口上的。
  • 一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
2、示例
反例:

现在有一个借口Animal,里边有eat,fly,swim三个方法,现在新建三个类,bird,dog,fish,这样,鱼就可以游泳,鸟可以飞,狗狗和鸟以及鱼都可以吃。代码如下:

/**
 * 项目名称:OpenCloseRole
 * 类 名 称:Animal
 * 类 描 述:TODO
 * 创建时间:2021/1/5 上午10:36
 * 创 建 人:wteng
 */

public interface Animal {
    void eat();
    void fly();
    void swim();
}
/**
 * 项目名称:OpenCloseRole
 * 类 名 称:Bird
 * 类 描 述:TODO
 * 创建时间:2021/1/5 上午10:40
 * 创 建 人:wteng
 */

public class Bird implements Animal {
    @Override
    public void eat() {
        System.out.println("鸟吃虫子");
    }

    @Override
    public void fly() {
        System.out.println("我飞!!!");
    }

    @Override
    public void swim() {
        System.out.println("不能游泳^ ^");
    }
}
/**
 * 项目名称:OpenCloseRole
 * 类 名 称:Dog
 * 类 描 述:TODO
 * 创建时间:2021/1/5 上午10:37
 * 创 建 人:wteng
 */

public class Dog implements Animal {
    @Override
    public void eat() {
        System.out.println("狗啃骨头");
    }

    @Override
    public void fly() {
        throw new UnsupportedOperationException("Tell me how???");
    }

    @Override
    public void swim() {
        System.out.println("狗刨");
    }
}
/**
 * 项目名称:OpenCloseRole
 * 类 名 称:Fish
 * 类 描 述:TODO
 * 创建时间:2021/1/5 上午10:39
 * 创 建 人:wteng
 */

public class Fish implements Animal {
    @Override
    public void eat() {
        System.out.println("大鱼吃小鱼,小鱼吃虾米");
    }

    @Override
    public void fly() {

    }

    @Override
    public void swim() {

    }
}

那么问题也是比较明显的,狗狗不会飞,鸟儿不会游泳,鱼不会飞,但是这三个类都实现了Animal接口,三个类中多出的方法,就显得有点多余了,不应该依赖它不需要的功能,还造成了接口的污染。
所谓接口污染就是为接口添加不必要的职责,如果开发人员在接口中增加一个新功能的目的只是减少接口实现类的数目,则此设计将导致接口被不断地“污染”并“变胖”。

正例
/**
 * 项目名称:OpenCloseRole
 * 类 名 称:Animal
 * 类 描 述:TODO
 * 创建时间:2021/1/5 上午10:56
 * 创 建 人:wteng
 */

public interface Animal {
    void eat();
}
/**
 * 项目名称:OpenCloseRole
 * 类 名 称:Flyable
 * 类 描 述:TODO
 * 创建时间:2021/1/5 上午10:57
 * 创 建 人:wteng
 */

public interface Flyable {
    void fly();
}
/**
 * 项目名称:OpenCloseRole
 * 类 名 称:Swimable
 * 类 描 述:TODO
 * 创建时间:2021/1/5 上午10:57
 * 创 建 人:wteng
 */

public interface Swimable {
    void swim();
}
/**
 * 项目名称:OpenCloseRole
 * 类 名 称:Bird
 * 类 描 述:TODO
 * 创建时间:2021/1/5 上午10:58
 * 创 建 人:wteng
 */

public class Bird implements Animal, Flyable {
    @Override
    public void eat() {

    }

    @Override
    public void fly() {

    }
}

/**
 * 项目名称:OpenCloseRole
 * 类 名 称:Dog
 * 类 描 述:TODO
 * 创建时间:2021/1/5 上午10:58
 * 创 建 人:wteng
 */

public class Dog implements Animal, Swimable {
    @Override
    public void eat() {

    }

    @Override
    public void swim() {

    }
}
/**
 * 项目名称:OpenCloseRole
 * 类 名 称:Fish
 * 类 描 述:TODO
 * 创建时间:2021/1/6 上午10:23
 * 创 建 人:wteng
 */

public class Fish implements Animal, Swimable {
    @Override
    public void eat() {

    }

    @Override
    public void swim() {

    }
}

按照新设计的结构来,Animal接口提取共性吃的特征,而游泳和飞翔写成独立的接口,这时候只需要实现动物独有的特征接口即可,也不会造成接口臃肿。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值