Шаблонный метод (Бао, у меня настой, я скучаю по твоей ночи)

интервью Java
Шаблонный метод (Бао, у меня настой, я скучаю по твоей ночи)

Есть чувства, есть галантерейные товары, поиск в WeChat【Третий принц Ао Бин] Подпишитесь на этого программиста, у которого есть кое-что.

эта статьяGitHub github.com/JavaFamilyВключено, и есть полные тестовые площадки, материалы и мой цикл статей для интервью с производителями первой линии.

Каждый раз, когда вы идете в компанию, вы обнаружите, что у каждой компании есть спецификация, такая как спецификация процесса отпуска, спецификация кода и так далее. У каждой компании есть этот процесс, но конкретные условия реализации разные.

в режиме дизайнаШаблон метода шаблона, который также можно понимать как нормативный шаблон. В основном для улучшения возможности повторного использования нашего кода, а также расширения и других проблем.

Такой метод шаблона также можно использовать, когда мы общаемся с нашими сестрами, например, этот шаблон:

«Бао, ХХХХ, ХХХХ какой ХХХ? Х твой ХХХ»

Когда я получаю такой шаблон, я могу напрямую применять его, делая выводы из других фактов, мы можем просто напрямую заполнять параметры, например:

"Бао, я был привит, какую прививку я получил, я люблю каждую твою секунду"

«Бао, я сделал нуклеиновую кислоту, какую бы кислоту я ни делал, я не получу твоей сердечной боли»

"Бао, я сегодня ходил на вливание, что за жидкость я влил, я скучаю по тебе сегодня вечером"

...........

Что ж, приступим к делу, паттерн «шаблонный метод» также очень распространен во фреймворках.

Сегодня поговорим о поведенческих паттернах проектирования в паттернах проектирования.Шаблон метода шаблона.

Предыдущие статьи из серии «Шаблоны проектирования»:

контур

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

определение

Каково определение и цель шаблона метода шаблона?

  • Определение. Шаблон шаблонного метода определяет скелет алгоритма в методе и откладывает выполнение определенных шагов до подклассов. Шаблон метода шаблона позволяет подклассам переопределять определенные шаги в алгоритме без изменения общей структуры алгоритма.

  • Цель: 1. Цель использования шаблона метода шаблона — избежать написания повторяющегося кода, чтобы разработчики могли сосредоточиться на реализации основной бизнес-логики.

    2. Решить проблему противоречия наследования между интерфейсом и классом реализации интерфейса.

    Приведенное выше определение взято из книги «Красота шаблонов проектирования».

Структурная схема:

  • AbstractTemplate: определите серию абстрактных методов, реализованных методов или методов ловушек. то есть: определить процесс
  • ConcreteTemplate (конкретный шаблон): реализует абстрактный метод родительского класса и реализует различные коды бизнес-логики на основе своей собственной бизнес-логики шаблона. То есть: абстрактный метод реализован одинаково, но внутренняя логика другая

Вся схема структуры по-прежнему выглядит очень просто, но все же необходимо понимать, какую задачу решает шаблон проектирования.

Код? Возьмем пример.

Возьмем приведенный выше отпуск в качестве примера. Предположим теперь, что компания А должна уйти в отпуск и должна быть одобрена непосредственным руководителем и уведомить HR о том, что кто-то просит отпуск.Компания Б должна находиться в прямом подчинении лидера, а отдел руководитель одобряет и, наконец, информирует отдел кадров о завершении всего процесса увольнения. Как справиться с этой проблемой в рамках офисного процесса ОД? Вы только посмотрите на реализацию кода!

public abstract class AskForLeaveFlow {

    // 一级组长直接审批
    protected abstract void firstGroupLeader(String name);

    // 二级组长部门负责人审批
    protected void secondGroupLeader(String name) {
    }

    // 告知HR有人请假了
    private final void notifyHr(String name) {
        System.out.println("当前有人请假了,请假人:" + name);
    }

    // 请假流模版
    public void askForLeave(String name) {
        firstGroupLeader(name);
        secondGroupLeader(name);
        notifyHr(name);
    }

}

Во-первых, определите процесс отпуска, в котором:

Метод firstGroupLeader абстрактно изменен, он должен быть реализован как подкласс

Утверждение лидера второго уровня secondGroupLeader, может быть переписано в подклассах или нет

Метод notifyHr предназначен для уведомления отдела кадров, который был реализован внутри компании.

Последний метод процесса ухода askForLeave, объедините вышеуказанные методы шаблона вместе.

public class CompanyA extends AskForLeaveFlow {
    
    @Override
    protected void firstGroupLeader(String name) {
        System.out.println("CompanyA 组内有人请假,请假人:" + name);
    }
}

public class CompanyB extends AskForLeaveFlow {
    @Override
    protected void firstGroupLeader(String name) {
        System.out.println("CompanyB 组内有人请假,请假人:" + name);
    }
    @Override
    protected void secondGroupLeader(String name){
        System.out.println("CompanyB 部门有人请假,请假人:" + name);
    }
}

В CompanyA и CompanyB второстепенный лидер secondGroupLeader может выбрать переписывать или нет.Этот метод шаблона класса называется методом-ловушкой.

public class testTemplate {
    public static void main(String[] args) {
        // 公司A请假流程模版
        AskForLeaveFlow companyA = new CompanyA();
        companyA.askForLeave("敖丙");
        // 结果:CompanyA 组内有人请假,请假人:敖丙
        //       当前有人请假了,请假人:敖丙

        AskForLeaveFlow companyB = new CompanyB();
        companyB.askForLeave("敖丙");
        // 结果:CompanyB 组内有人请假,请假人:敖丙
        //      CompanyB 部门有人请假,请假人:敖丙
        //      当前有人请假了,请假人:敖丙
    }
}

Наконец, посмотрите на результаты испытаний купола. компания A и компания B выводят соответствующий процесс отпуска соответственно.

Внимательные студенты могли обнаружить, что в качестве шаблонного метода, помимо абстрактных методов, могут быть также конкретные методы реализации и методы-ловушки.

Поэтому в процессе применения вы можете подумать, следует ли определять метод шаблона внутренне, должен ли он быть определен как абстрактный метод или что-то еще.

приложение в рамках

Шаблон метода шаблона также очень распространен в наших общих средах Java, но, возможно, мы обычно не замечаем этого.

Первый: Прежде всего, когда мы изучим SpringMVC, мы сначала напишем несколько сервлетов для обработки какой-либо публикации или получения запросов и т. д.

Глядя прямо на исходный код здесь, вы можете обнаружить, что это также идея прямого использования режима метода шаблона, В течение периода метод шаблона также отражается в HttpServlet, наследующем GenericServlet, что показывает, что шаблон может быть построен абстрактно много раз.

Второй: в часто задаваемых файловых потоках InputStream, OutputStream, Reader, Writer и т. д. в классе Java IO можно увидеть шаблон метода шаблона.

Выше приведен исходный код некоторого InputStream, который я опубликовал, в основном рассматривая метод шаблона чтения, который является воплощением режима метода шаблона.

Конечно, в классе IO есть много других, я не буду выкладывать исходный код один за другим, учащиеся, которым это интересно, могут открыть исходный код, чтобы понять его.

бизнес-пример

Как использовать шаблонный метод в бизнесе?

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

Я написал модель цепочки ответственности ранее и, наконец, дал вам пример деталей продукта.На этот раз я все еще использую детали продукта, но для реализации этой проблемы используется модель шаблонного метода, которая понимается как версия 2.0 бизнеса Детали.

Мы можем отображать детали продукта в модулях, такие как изображение заголовка, информация о продукте, информация о артикуле, адрес доставки, оплата в рассрочку и т. д.

Итак, как собрать для отображения информации о продукте?

блок-схема:

Вы видите, что приходит запрос, и ассемблер модуля может выбрать сборку возвращаемого результата.

Чтобы упомянуть точку, чтобы сократить время запроса всей ссылки, когда модуль, запрошенный на втором этапе, можно считать последовательным или параллельным (обработка открытого пула потоков).

Давайте посмотрим на код напрямую

public abstract class AbstractTemplateBlock<T> {
    // 组装结果
    public T template(ModelContainer modelContainer) {
        T block = initBlock();
        try {
            this.doWork(modelContainer, block);
        } catch (Exception e) {
            // 可以选择捕获异常,是中断流程,还是只打印日志,不中断流程
        }
        return block;
    }
    // 初始化构建返回结果模型
    protected abstract T initBlock();
    // 定义抽象模版
    protected abstract void doWork(ModelContainer modelContainer, T block) throws Exception;
}

Или сначала создайте блок шаблона

@Component
public class ItemInfoBlock extends AbstractTemplateBlock<ItemInfoBlock.ItemInfo> {
    @Override
    protected ItemInfoBlock.ItemInfo initBlock() {
        return new ItemInfoBlock.ItemInfo();
    }

    // 模拟业务逻辑,组装返回商品信息模块数据
    @Override
    protected void doWork(ModelContainer modelContainer, ItemInfo block) throws Exception {
        block.setItemId(123L);
        block.setItemName("测试");
    }
    @Data
    public static class ItemInfo {
        private Long itemId;
        private String itemName;
    }
}

Здесь прописан только один ItemInfoBlock, а остальные модули написаны так же, поэтому прописаны не все.

    public static void main(String[] args) {
        // 1.模拟获取SpringBean
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        ItemInfoBlock itemInfoBlock = (ItemInfoBlock) applicationContext.getBean("itemInfoBlock");

      // 2. ModelContainer可以理解为贯穿上下文中的请求参数,或者一些组装数据需要的预加载数据
       ModelContainer modelContainer  = new ModelContainer();
       // 3. 获取返回结果
       ItemInfoBlock.ItemInfo itemInfo = itemInfoBlock.template(modelContainer);
       System.out.println(JSON.toJSONString(itemInfo));
       // 结果:{"itemId":123,"itemName":"测试"}
    }

Наконец, взгляните на тестовую демонстрацию: вы видите, что в каждом модуле есть AbstractTemplateBlock, который содержит абстрактный метод doWork, а подкласс реализует текущую бизнес-логику.

В то же время, когда третьим шагом является получение возвращаемого результата, я просто перечисляю его отдельно, и вы можете вносить изменения в соответствии с реальной ситуацией. Например, возврат структуры карты и т. д. mapKey — это имя модуля, а значение — это данные.

Текущий способ сборки деталей продукта также является относительно распространенным способом. Возможность повторного использования кода высока, а также в определенной степени отражается масштабируемость, что соответствует идее режима шаблонного метода.

Суммировать

Вы должны быть в состоянии понять характеристики шаблона метода шаблона.Применимым сценарием является повышение возможности повторного использования и масштабируемости кода.

СноваСуществование разумно, не форсируйте вложение при написании кода из-за шаблонов проектирования. Разумное изучение каждого шаблона проектирования подходит для сцены и того, какую проблему он решает.

Бао, завтра может не смогу нормально обновиться, болею и инфу.

Я Ао Бин,Чем больше вы знаете, тем больше вы не знаете, спасибо за ваши таланты:как,собиратьиКомментарий, увидимся в следующий раз!


Статья постоянно обновляется, вы можете искать в WeChat "Третий принц Ао Бин"Прочтите это в первый раз, ответьте [материал] Подготовленные мной материалы интервью и шаблоны резюме крупных заводов первой линии, эта статьяGitHub github.com/JavaFamilyОн был включен, и есть полные тестовые сайты для интервью с крупными заводами.Добро пожаловать в Star.