美文网首页
嘻哈说:设计模式之接口隔离原则

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

作者: 番茄课堂_懒人 | 来源:发表于2018-08-24 09:07 被阅读0次
    嘻哈说-设计模式

    1、定义

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

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

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

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

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

    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、嘻哈说

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

    番茄课堂,学习也要酷。

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

    试听请点击这里

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

    相关文章

      网友评论

          本文标题:嘻哈说:设计模式之接口隔离原则

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