шаблон проектирования стратегии

задняя часть

предисловие

Обновляю блог через месяц, и снова продолжу~ (уже третий месяц) Недавно я занимался рефакторингом режима стратегии, который просто предоставил материал для ведения блога.Далее я познакомлю вас с режимом стратегии~

Определение шаблона стратегии

Паттерны стратегии: поведенческие паттерны, принадлежащие объекту. Цель состоит в том, чтобы инкапсулировать каждый алгоритм в отдельный класс с общим интерфейсом для набора алгоритмов, что делает их взаимозаменяемыми.

По сути, это упаковка алгоритма (то есть обработка нашей бизнес-логики), которая заключается в том, чтобы отделить ответственность за использование алгоритма от самого алгоритма, а управление делегировать разным объектам. Шаблон стратегии обычно оборачивает ряд алгоритмов в ряд классов стратегий в качестве подкласса абстрактного класса стратегии. В одном предложении это звучит так: «Подготовьте набор алгоритмов и инкапсулируйте каждый алгоритм, чтобы они были взаимозаменяемыми».

Разобравшись с определением, давайте посмотрим на общую диаграмму классов шаблона стратегии:

Согласно этой диаграмме мы видим участников паттерна стратегии:

Контекст: роль контекста, которая содержит ссылку на стратегию.

Стратегия: Роль абстрактной стратегии, которая является абстрактной ролью, обычно реализуемой интерфейсом или абстрактным классом. Эта роль предоставляет все интерфейсы, требуемые конкретными классами политик.

ConcreteStrategy: конкретные стратегические роли, обертывание связанных алгоритмов или поведения, а также реализация или наследование абстрактных стратегических ролей.

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

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

Это простая реализация шаблона стратегии.

Сценарии и примеры использования паттернов стратегии

Мы часто сталкиваемся с большим количеством блоков кода if/else.

Например, необходимо наказание на рабочем месте, штраф в размере 100 юаней за опоздание и штраф в размере 200 юаней за работу и сон. Наше наказание теперь только два, когда их становится все больше и больше Значит наказание, тогда у нас будет все больше и больше условий суда здесь. Избыточность кодовых блоков.

public class WorkPunish {

   public static void main(String[] agrs){
       String state ="late";
       punish(state);
   }
   
   public static void punish(String state){
       if ("late".equals(state)){
           System.out.println("罚100");
       }else if ("sleep".equals(state)){
           System.out.println("罚200");
       }  System.out.println("警告");
   }
}

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

Следующим шагом будет использование демо режима стратегии.

Впервые определите абстрактный интерфейс, включая метод штрафа

public interface IPunish {
    void exePunish();
}

Следующим шагом является написание конкретного класса реализации, реализация абстрактного интерфейса, реализация методов абстрактного класса и обработка конкретной логики здесь. Обратите внимание, что здесь мы также унаследовали InitializingBean. Интерфейс InitializingBean предоставляет способ инициализации компонента. Он включает только метод afterPropertiesSet. Все классы, наследующие этот интерфейс, будут выполнять этот метод при инициализации компонента. Объект будет зарегистрирован, а потом посмотрим на реализацию регистрации~

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

@Component
public class LatePunish implements IPunish,InitializingBean{
    public void exePunish() {
        System.out.println("罚100");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        PunishFactory.registerPunish("late", this);
    }
}

Это заводской класс. Все реализации регистрируются здесь во время инициализации и сохраняются в карте. В соответствии с потребностями клиента выберите соответствующий объект реализации для вызова определенного метода.

import java.util.HashMap;
import java.util.Map;
public class PunishFactory {

    private static Map<String,IPunish> punishMap = new HashMap<String,IPunish>();
    private PunishFactory() {}
    private static final IPunish EMPTY = new EmptyPunish();
    //获取
    public static IPunish getPunish(String state) {
        IPunish result = punishMap.get(state);
        return result == null ? EMPTY : result;
    }
    //将处罚对象注册到这里
    public static void registerPunish(String state,IPunish o){
        punishMap.put(state, o);
    }
    private static class EmptyPunish implements IPunish {
        public void exePunish() {
            // Empty class
        }
    }
}

Следующий шаг — логика обработки if/else после реконструкции, нужно только получить объект, выигравший пари по соответствующему состоянию, вызвать метод реализации и выполнить требования.

public class WorkPunish {
    public static void main(String[] agrs){
        String state ="late";
        IPunish punish = PunishFactory.getPunish(state);
        punish.exePunish();
    }
}

На этом наша реализация завершена, и это сценарий, в котором используется шаблон стратегии.

Преимущества паттерна стратегии

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

Режим стратегии обеспечивает управление и обслуживание класса алгоритмов.

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

Недостатки шаблона стратегии

Клиент должен знать все классы политик и решать, какой из них использовать.

Будет много классов политики, что увеличит количество предметов класса.

Эпилог

На этом изучение шаблона стратегии в этой статье закончено.Конечно, содержание шаблона стратегии намного больше.Пример в статье состоит в том, чтобы объединить шаблон стратегии и шаблон фабрики для рефакторинга кода. . Итак, вы понимаете заводской режим?Увидимся в следующей статье~