Стратегический шаблон внешнего дизайна

внешний интерфейс Шаблоны проектирования

предисловие

Адрес доставки:

Заводской шаблон внешнего дизайна

Прокси-режим режима внешнего дизайна

Шаблон проектирования перешел в раздел III, первые два — это заводской режим и режим прокси, затем продолжаем нашу ссылку на 23 шаблона проектирования — режим политики.

режим стратегии

Определение и характеристики паттернов стратегии

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

Основные преимущества паттерна стратегии заключаются в следующем:

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

Его основные недостатки заключаются в следующем:

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

Популярное понимание паттерна стратегии

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

Описание клиента рекомендация питомца фото питомца
Детские клиенты: в основном рекомендуют некоторых маленьких собак, которые ведут себя лучше и менее агрессивны. Шиба-ину
Женщины-клиенты: в основном рекомендуют некоторых маленьких собак с более привлекательным внешним видом. самоед, чихуахуа
Покупатели Head Iron: в основном рекомендуют некоторых особых метательных, настоящих питомцев-воинов. Хаски

Вышеупомянутые 🌰 все это единичные условия, но на самом деле многие ситуации будут намного сложнее.Например, клиенты будут смешаны с различными факторами, такими как возраст, пол, жизненные привычки, семейное окружение, личная личность и т. д., поэтому пользователь Портрет поведения — очень сложный и детальный вопрос, что также приводит к множеству условных факторов помех, когда мы имеем дело с предпочтениями клиентов, и алгоритм рекомендаций будет более сложным.

Боевой проект

Решайте бизнес с несколькими условиями

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

const orderType = 1 // 1: 美妆,2:电器,3:家具
if (orderType === 1) {
  console.log('美妆订单')  // 简单是用打印方法来举例,实际可以当做每个订单条件跳转、展示的操作都不一样
} else if (orderType === 2) {
  console.log('电器订单')
} else if (orderType === 3) {
  console.log('家具订单')
} 

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

const orderType = 1 // 1: 美妆,2:电器,3:家具

const orderFunction = {
  1() { console.log('美妆订单') },
  2() { console.log('电器订单') },
  3() { console.log('家具订单') },
}

orderFunction[orderType]()

Решите несколько вложенных условных операций

Однако наш бизнес может быть более сложным.Мы принимаем модель встраивания h5 в другие приложения на странице заказа.Мы можем встраивать этот бизнес в различные среды, такие как быстрое приложение, RN, нативное приложение, апплет, h5 и т. д. Содержание и маршрутизация Прыжки могут быть разными.Чтобы увеличить сложность и сделать ее более интуитивной, каждое соответствующее правило по умолчанию использует совершенно другой метод.

const orderType = 1 // 1: 美妆,2:电器,3:家具
const orderWay = 1 // 1:h5,2:app,3:小程序

if (orderType === 1) {
  if (orderWay === 1) {
    console.log('美妆订单h5')
  } else if (orderWay === 2) {
    console.log('美妆订单app')
  } else if (orderWay === 3) {
    console.log('美妆订单小程序')
  }
} else if (orderType === 2) {
  if (orderWay === 1) {
    console.log('电器订单h5')
  } else if (orderWay === 2) {
    console.log('电器订单app')
  } else if (orderWay === 3) {
    console.log('电器订单小程序')
  }
} else if (orderType === 3) {
  if (orderWay === 1) {
    console.log('家具订单h5')
  } else if (orderWay === 2) {
    console.log('家具订单app')
  } else if (orderWay === 3) {
    console.log('家具订单小程序')
  }
}

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

Хотя вышеприведенные условия являются несколькими вложенными условиями, их все же можно понимать как комбинацию типа заказа и типа среды.Мы используем объект карты es6 для преобразования

const orderType = 1 // 1: 美妆,2:电器,3:家具
const orderWay = 2 // 1:h5,2:app,3:小程序

const strategy = () => { // 订单类型+环境类型策略
  const map = new Map([
    [{
      orderType: 1,
      orderWay: 1
    }, () => {
      console.log('美妆订单h5')
    }],
    [{
      orderType: 1,
      orderWay: 2
    }, () => {
      console.log('美妆订单app')
    }],
    [{
      orderType: 1,
      orderWay: 3
    }, () => {
      console.log('美妆订单小程序')
    }],
    [{
      orderType: 2,
      orderWay: 1
    }, () => {
      console.log('电器订单h5')
    }],
    [{
      orderType: 2,
      orderWay: 2
    }, () => {
      console.log('电器订单app')
    }],
    [{
      orderType: 2,
      orderWay: 3
    }, () => {
      console.log('电器订单小程序')
    }],
    [{
      orderType: 3,
      orderWay: 1
    }, () => {
      console.log('家具订单h5')
    }],
    [{
      orderType: 3,
      orderWay: 2
    }, () => {
      console.log('家具订单app')
    }],
    [{
      orderType: 3,
      orderWay: 3
    }, () => {
      console.log('家具订单小程序')
    }],
  ])
  return map
}

const run = (orderType, orderWay) => {
  let action = [...strategy()].filter(([key, value]) => (key.orderType === orderType && key.orderWay === orderWay))
  action.forEach(([key, value]) => value.call(this))
}

run(orderType, orderWay)

Как рефакторинг выше, мы используем характеристики объекта карты (здесь мы не будем делать более глубокое объяснение объекта карты). Если есть новые правила, мы можем добавить соответствующие правила и методы на карту, чтобы уменьшить возникновение ада условной вложенности, и логика станет более ясной. Но на практике подобные методы тоже можно комбинировать, и логика будет понятнее.

Решение ада множественных вложенных условий

Решения для приведенных выше множественных вложенных условий относительно просты, и в реальности трудно получить такое идеальное условное суждение. Далее, посмотрите, каковы декорации ада

const orderType = 1 // 1: 美妆,2:电器,3:家具
const orderWay = 1 // 1:h5,2:app,3:小程序
const orderMoney = 100 // 金额范围划分,0-100,100-1000,1000以上,跳转的订单详情也不相同

if (orderType === 1) {
    if (orderWay === 1) {
        if (0 <= orderMoney && orderMoney < 100) {
            console.log('美妆订单h5-0')
        } else if (orderMoney < 1000) {
            console.log('美妆订单h5-100')
        } else {
            console.log('美妆订单h5-1000')
        }
    } else if (orderWay === 2) {
        if (0 <= orderMoney && orderMoney < 100) {
            console.log('美妆订单app-0')
        } else if (orderMoney < 1000) {
            console.log('美妆订单app-100')
        } else {
            console.log('美妆订单app-1000')
        }
    } else if (orderWay === 3) {
        if (0 <= orderMoney && orderMoney < 100) {
            console.log('美妆订单小程序-0')
        } else if (orderMoney < 1000) {
            console.log('美妆订单小程序-100')
        } else {
            console.log('美妆订单小程序-1000')
        }
    }
} // 条件判断次数太多,所以此处只用了一层条件

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

const orderType = 1 // 1: 美妆,2:电器,3:家具
const orderWay = 1 // 1:h5,2:app,3:小程序
const orderMoney = 10000 // 金额范围划分,0-100,100-1000,1000以上,跳转的订单详情也不相同

const orderMoneyStrategy = (orderMoney) => { // 提取金额策略
    if (0 <= orderMoney && orderMoney < 100) {
        return 1
    } else if (orderMoney < 1000) {
        return 2
    }
    return 3
}

const strategy = () => { // 订单类型+环境类型策略
    const map = new Map([
        [{
            orderType: 1,
            orderWay: 1,
            orderMoney: 1
        }, () => {
            console.log('美妆订单h5-0')
        }],
        [{
            orderType: 1,
            orderWay: 1,
            orderMoney: 2
        }, () => {
            console.log('美妆订单h5-100')
        }],
        [{
            orderType: 1,
            orderWay: 1,
            orderMoney: 3
        }, () => {
            console.log('美妆订单h5-1000')
        }],
    ])
    return map
}

const run = (orderType, orderWay, orderMoney) => {
    let action = [...strategy()].filter(([key, value]) => (key.orderType === orderType && key.orderWay === orderWay && key.orderMoney === orderMoney))
    action.forEach(([key, value]) => value.call(this))
}

run(orderType, orderWay, orderMoneyStrategy(orderMoney))

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

Дополнительная информация

Полный демонстрационный адрес:Боевая демонстрация проекта, друзья, которым нравится, могутstarДалее мы будем постепенно расширять этот проект в соответствии с введением сообщения в блоге о режиме дизайна.

Здание города ручной собачьей головы

В этой статье используетсяmdniceнабор текста