предисловие
Адрес доставки:
Заводской шаблон внешнего дизайна
Прокси-режим режима внешнего дизайна
Шаблон проектирования перешел в раздел 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набор текста