Июньские преимущества
В июне 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获取更多资讯