Давайте поговорим о режиме стратегии из дизайна совокупного платежного бизнеса.

Spring Boot Java

Июньские преимущества

В июне 2020 года на первое место в оригинальной статье общественного номера Нонг Сяопан будет отправлен новый «Spring Boot в действии》Физическая книга, которая является популярной основой для обученияSpring Bootклассика.Вам больше нужно полагаться не на удачу, а на тяжелую работу. Крайний срок сбора статистики 30 июня 2020 г. Статистические данные основаны на официальном инструменте публичного аккаунта. Операторы не участвуют в мероприятии. Сборник этого мероприятия спонсируется сообществом Nuggets.

1. Введение

Несколько дней назад я сказалШаблоны команд в шаблонах проектирования, давайте посмотрим на другой шаблон сегодня. Мобильные платежи сейчас очень популярны в Китае, и даже 70-летняя тётя за завтраком внизу также использует Alipay и WeChat Pay для продажи яичных пирогов. Если вы создаете приложение, вы должны рассмотреть несколько каналов оплаты, чтобы обеспечить каналы привлечения клиентов. Как бы вы спроектировали, если бы вам разрешили доступ к нескольким платежным каналам?

2. Обычный способ письма

В общем случае легко создать следующую нотацию:

    public boolean pay(BigDecimal amount){
        
        boolean ret =false;
        if (alipay){
            //todo 支付宝的逻辑
        }else if (wechatpay){
            //todo 微信支付的逻辑
        }else if (ooxx){
           // …… 
        }
        return ret;
    }

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

3. Режим стратегии

Большинство платежей можно упростить до этого процесса:

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

Это использует шаблон стратегии в шаблонах проектирования:

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

  • Strategyинтерфейс. Этот интерфейс используется для объявления независимой стратегии выполнения каждого метода и для инкапсуляции логики конкретного алгоритма конкретной стратегии.
  • ConcreteStrategyдаStrategyкласс реализации. Реализована логика алгоритма различных стратегий. Например, детали вызова каждого платежа и т. д.
  • Contextконтекст. Он ссылается на конкретную стратегию через интерфейс стратегии и использует конкретную стратегию для выполнения логики.В то же время общность всех стратегий также может обрабатываться единообразно в этом классе. В сводном платежном требовании мы передаем стратегию, сначала выполняем логику перед оплатой, а затем используем стратегию.После выполнения стратегии выполняем общую логику.
  • Clientклиент.创建策略对象并传递给上下文Context, а затем запустите конкретную политику в соответствии с контекстом.

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

Затем мы можем создать три объекта стратегии для платежей Alipay, WeChat и UnionPay соответственно.AliPayStrategy,WechatPayStrategy,UnionPayStrategy, смоделируем стратегию выполнения:

public class Client {

    public static void main(String[] args) {
        // 获取请求中的支付渠道标识
        String code = "p01";
        PayStrategy payStrategy = null;
        PayRequest request = null;
        
        if (PayType.ALI.getCode().equals(code)) {
            //组装为支付宝支付策略
            payStrategy = new AliPayStrategy();
            // 构造支付宝请求参数
            request = new AliPayRequest();
        }
        if (PayType.WECHAT.getCode().equals(code)) {
            //组装为微信支付策略
            payStrategy = new AliPayStrategy();
            // 构造微信支付请求参数
            request = new WechatPayRequest();
        }

        if (PayType.UNION.getCode().equals(code)) {
            //组装为银联支付策略
            payStrategy = new UnionPayStrategy();
            // 构造银联支付请求参数
            request = new UnionPayRequest();
        }

        if (Objects.nonNull(payStrategy)) {
            PayContext payContext = new PayContext();
            payContext.setPayStrategy(payStrategy);
            payContext.pay(request);
        }
    }
}

Получаем идентификатор платежа в запросе, затем инициализируем соответствующую платежную стратегию, инкапсулируем указанные параметры запроса и передаем в объект контекстаPayContextчтобы выполнить запрос. если вы добавите что-нибудьApplePayи т. д. для достиженияApplePayStrategyВот и все.

4. Преимущества и недостатки

Не все паттерны стратегии положительны.

4.1 Преимущества

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

4.2 Недостатки

  • Клиент должен явно знать условия, при которых политика будет активирована.
  • Введите слишком много классов политик.
  • Может быть заменен каким-либо функциональным интерфейсом. Поддельный кодPay.request(data).strategy(data->{ }).

5. Резюме

Шаблон стратегии также является очень распространенным и широко используемым шаблоном проектирования. Сегодня мы изучили паттерн стратегии от агрегированного платежа, а также провели анализ его преимуществ и недостатков. вместе сфункциональное программированиеС ростом популярности режима стратегии режим стратегии постепенно вытеснялся, но его все же стоит изучить. Спасибо за прочтение, следите за обновлениями:Код Фермер Маленький Толстый Брат, предлагается больше галантереи программирования. старые правилаDEMOОтветить после подпискиstrategyПолучать.

关注公众号:Felordcn获取更多资讯

Личный блог: https://felord.cn