Хип-хоп сказал: принцип изоляции интерфейса шаблонов проектирования

Java Шаблоны проектирования

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, способ приготовления в Kitchen.

Чем вызвано это явление?

Интерфейс недостаточно минимизирован. Принцип изоляции интерфейса призван решить эту проблему.

Мы можем написать два интерфейса: один — для приготовления пищи, а другой — для мытья овощей.

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("小厨洗菜");
    }
}

Chef также не имеет избыточного кода.

Разве этот способ письма не более элегантен?

Если вы добавите тип шеф-повара, который и моет, и готовит, то вы можете реализовать интерфейсы ICook и IWash одновременно.

3. Преимущества

Он похож на принцип единой ответственности, и его преимущества аналогичны.

уменьшить рискИзменение одной из служб не повлияет на службы.

Простота обслуживания и расширенияБез избыточного кода интерфейс, соответствующий принципу изоляции интерфейсов, будет легче расширять и поддерживать.

4. Хип-хоп говорит

Далее, пожалуйста, наслаждайтесьОригинальная песня о принципе разделения интерфейса.

嘻哈说:接口隔离原则
作曲:懒人
作词:懒人
Rapper:懒人

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

Прослушивание, пожалуйста, нажмите здесь

Когда мне нечего делать и слушать музыку, знания наполняют мой разум;

Не следует недооценивать изучение новых способов ношения наушников.