嘻哈说:设计模式之接口隔离原则

栏目: 后端 · 发布时间: 6年前

内容简介:按照惯例,首先我们来看一下接口隔离原则的定义。类间的依赖关系应该建立在接口中的方法应该尽量少,不要使接口过于臃肿,不要有很多不相关的逻辑方法。

按照惯例,首先我们来看一下接口隔离原则的定义。

类间的依赖关系应该建立在 最小的接口 上。

接口中的方法应该尽量少,不要使接口过于臃肿,不要有很多不相关的逻辑方法。

有点类似于单一职责原则,都是功能尽可能的简单单一,不要冗余太多其他不相关的。

单一职责原则主要是类与方法,而接口隔离原则却是对接口而言的。

2、场景

小厨洗菜,大厨做饭。

在番茄餐厅的后厨,老板与求生欲极强的厨师长在聊天。

老板:最近我们番茄餐厅广受好评,菜品味道美味,这还得感谢你这位厨师长呀。

厨师长:应该的,这该感谢我。

老板:嗯?你确定?

厨师长:还没,还没说完,这该感谢我...们的郝老板,这次确定了。(冷汗)

老板:你这求生欲厉害了,叹为观止呀。不过现在随着顾客的增多,人手再次不够了,再招厨师肯定来不及了,你有什么好办法吗?

厨师长:办法我还真有一个,我们可以招点小厨,小厨要好招一些。

老板:但小厨做饭不够美味,很容易流失客户的。

厨师长:小厨不做饭,小厨只负责洗菜。这样呢,大厨就不用洗菜了,只负责做饭,这样效率就上去了。

老板:你是不是不想洗菜?

厨师长:当然不是,我就是,就是,就是替公司着想。

老板:好吧,准了,招人吧。

3、代码

之前我们在依赖倒置原则聊过 对接口编程 ,所以,首先我们定义一个厨师接口。

package com.fanqiekt.principle.segregation;

/**
 * 厨师接口
 *
 * @author 番茄课堂-懒人
 */
public interface IChef {

    /**
     * 洗菜
     */
    void wash();

    /**
     * 做饭
     */
    void cooking();
}
复制代码

厨师做两件事,一个是洗菜,一个是做菜。

接下来,我们写一下大厨的代码,大厨实现了厨师接口。

大厨做饭,但不负责洗菜。

package com.fanqiekt.principle.segregation;

/**
 * 大厨
 *
 * @author 番茄课堂-懒人
 */
public class BigChef implements IChef {

    /**
     * 洗菜的逻辑与大厨无关
     */
    @Override
    public void wash() {

    }

    @Override
    public void cooking() {
        System.out.println("大厨做饭");
    }
}
复制代码

我们再写一下小厨的部分,小厨也是实现厨师接口。

小厨不做饭,小厨只洗菜。

package com.fanqiekt.principle.segregation;

/**
 * 小厨
 *
 * @author 番茄课堂-懒人
 */
public class Kitchen implements IChef {
    @Override
    public void wash() {
        System.out.println("小厨洗菜");
    }

    /**
     * 做饭的逻辑与小厨无关
     */
    @Override
    public void cooking() {

    }
}
复制代码

这样的写法,好不好?

当然不好,每个类都冗余了与他不相关的方法。例如,BigChef中的wash方法、Kitchen中的cooking方法。

这种现象是怎么导致的呢?

接口不够最小化。接口隔离原则就是为了解决这种问题的。

我们可以写成两个接口,一个是做饭的接口,一个是洗菜的接口。

package com.fanqiekt.principle.segregation;

/**
 * 做饭接口
 *
 * @author 番茄课堂-懒人
 */
public interface ICook {

    /**
     * 做饭
     */
    void cooking();
}

复制代码

做饭的接口。

package com.fanqiekt.principle.segregation;

/**
 * 洗菜接口
 *
 * @author 番茄课堂-懒人
 */
public interface IWash {

    /**
     * 洗菜
     */
    void wash();

}
复制代码

洗菜的接口。

我们再来看一下符合接口隔离原则的具体实现类。

package com.fanqiekt.principle.segregation;

/**
 * 大厨
 *
 * @author 番茄课堂-懒人
 */
public class BigChef implements ICook{

    /**
     * 大厨只负责做饭,只处理和做饭相关的逻辑
     */
    @Override
    public void cooking() {
        System.out.println("大厨做饭");
    }
}
复制代码

这样就没有冗余代码了。

package com.fanqiekt.principle.segregation;

/**
 * 小厨
 *
 * @author 番茄课堂-懒人
 */
public class Kitchen implements IWash {

    /**
     * 小厨只负责洗菜,只处理和洗菜相关的逻辑
     */
    @Override
    public void wash() {
        System.out.println("小厨洗菜");
    }
}
复制代码

小厨同样也没有冗余代码了。

这样的写法是不是更加的优雅了。

如果新增一种既洗菜又做饭的厨师类型,那同时实现ICook与IWash接口就可以了。

3、优点

它与单一职责原则类似,优点也是类似的。

降低风险修改其中的一个业务,不会影响到业务。

易维护易扩展没有冗余代码,符合接口隔离原则的接口,会更加容易扩展以及维护。

4、嘻哈说

闲来无事听听曲,知识已填脑中去; 学习复习新方式,头戴耳机不小觑。

番茄课堂,学习也要酷。

接下来,请您欣赏懒人为接口隔离原则创作的歌曲。

试听请点击这里

嘻哈说:接口隔离原则

奋斗了多年总算熬成了大厨才不要关心洗菜
这些琐事都摘不掉
刚入行一两年但兢兢业业的小厨还不到烹饪大菜
因为这些来不了
所以接口功能太多在胡闹
接口功能应该尽可能最少
这就是接口隔离
核心思想就是接口最小
这样才结构得体
风险降低易扩展维护也有格局
用起来它是绝对合理
复制代码

以上所述就是小编给大家介绍的《嘻哈说:设计模式之接口隔离原则》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Zero to One

Zero to One

Peter Thiel、Blake Masters / Crown Business / 2014-9-16 / USD 27.00

“This book delivers completely new and refreshing ideas on how to create value in the world.” - Mark Zuckerberg, CEO of Facebook “Peter Thiel has built multiple breakthrough companies, and ......一起来看看 《Zero to One》 这本书的介绍吧!

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具