Есть чувства, есть галантерейные товары, поиск в WeChat【Третий принц Ао Бин] Подпишитесь на этого программиста, у которого есть кое-что.
эта статьяGitHub github.com/JavaFamilyВключено, и есть полные тестовые площадки, материалы и мой цикл статей для интервью с производителями первой линии.
Недавно со мной общалась школьница, как эффективно избежать длинного списка кодов в коде.if elseсудить илиswitchУсловное суждение? Ответ на большее — разумно использовать дизайн, чтобы обойти эту проблему.
В режиме конструктора вы можете использоватьзаводской узорилирежим стратегииЧтобы справиться с такими проблемами, фабричная модель была опубликована ранее, и заинтересованные студенты могут просмотреть ее.
Предыдущие статьи из серии «Шаблоны проектирования»:
- одноэлементный шаблон
- заводской узор
- Движок процесса
- режим строителя
- режим прототипа
- Модель цепочки ответственности
- Шаблон наблюдателя
Так в чем же разница между фабричным паттерном и паттерном стратегии?
- Фабричный шаблон — это порождающий шаблон проектирования, который в основном используется для создания разных объектов для разных типов для достижения разделения объектов класса.
- Паттерн стратегии — это поведенческий шаблон проектирования, который в основном предназначен для создания соответствующего поведения для различных стратегий для достижения поведенческой развязки.
В этот раз поговорим об этом подробнеережим стратегииКак достигается поведенческая развязка
контур
определение
Что такое режим стратегии? Как это работает в принципе?
Определяя семейство алгоритмов, инкапсулируя каждый алгоритм и делая их взаимозаменяемыми, различные стратегии позволяют изменять алгоритмы независимо от клиентов, использующих их. Приведенное выше определение исходит из красоты шаблонов проектирования.
Чувствуете себя немного абстрактно? Давайте посмотрим на структурную схему
- Стратегия (абстрактная стратегия): абстрактный класс стратегии и определение записи выполнения стратегии
- ConcreteStrategy (конкретная стратегия): реализовать абстрактную стратегию, реализовать метод алгоритма
- Контекст (среда): запуск определенного класса стратегии.
Таким образом, структура на самом деле не сложна и похожа на шаблон состояния.
Так как же работает этот код?
Например, все знакомы с автомобилями. Надеюсь, каждый сможет осуществить свою автомобильную мечту как можно скорее. Разные передачи автомобиля (concreteStrategy) — это как разные стратегии. Водитель выбирает несколько передач, и машина движется вперед на нескольких передачах. Весь выбор в вождении, в руках контекста.
public interface GearStrategy {
// 定义策略执行方法
void algorithm(String param);
}
Во-первых, сначала определите абстрактную стратегию
Это в виде интерфейса, и есть еще один способ использования абстрактного методаabstractТо же самое касается письма. Выбор за каждым.
public abstract class GearStrategyAbstract { // 定义策略执行方法 abstract void algorithm(String param); }
public class GearStrategyOne implements GearStrategy {
@Override
public void algorithm(String param) {
System.out.println("当前档位" + param);
}
}
Затем определите конкретную стратегию передачи и реализуйте метод алгоритма.
public class Context {
// 缓存所有的策略,当前是无状态的,可以共享策略类对象
private static final Map<String, GearStrategy> strategies = new HashMap<>();
// 第一种写法
static {
strategies.put("one", new GearStrategyOne());
}
public static GearStrategy getStrategy(String type) {
if (type == null || type.isEmpty()) {
throw new IllegalArgumentException("type should not be empty.");
}
return strategies.get(type);
}
// 第二种写法
public static GearStrategy getStrategySecond(String type) {
if (type == null || type.isEmpty()) {
throw new IllegalArgumentException("type should not be empty.");
}
if (type.equals("one")) {
return new GearStrategyOne();
}
return null;
}
public static void main(String[] args) {
// 测试结果
GearStrategy strategyOne = Context.getStrategy("one");
strategyOne.algorithm("1档");
// 结果:当前档位1档
GearStrategy strategyTwo = Context.getStrategySecond("one");
strategyTwo.algorithm("1档");
// 结果:当前档位1档
}
}
Последнее — реализовать среду выполнения (Context), вы можете определить ее как StrategyFactory, но все это означает одно и то же.
В тестовой демонстрации в основном методе вы можете видеть, что разные стратегии могут быть реализованы через разные типы, это основная идея шаблона стратегии.
В Context определены два метода записи:
- Во-первых, поддерживать контейнер стратегий Map. Таким образом, необходимо определить, можно ли разделить каждую стратегию, это всего лишь реализация алгоритма.
- Второй — пройти непосредственно через класс с отслеживанием состояния, каждый раз, когда создается новый объект класса политики в соответствии с типом. Об этом нужно судить в соответствии с реальным бизнес-сценарием.
применение рамок
Шаблон стратегии также отражен в очень распространенном месте во фреймворке, и все, должно быть, использовали его.
Это пул потоков в JDK.ThreadPoolExecutor
Во-первых, определить такой пул потоков, который реализует стратегию исключений пула потоков.
Стратегия исключений этого пула потоков заключается в использовании шаблона стратегии.
В исходном коде есть абстрактный интерфейс стратегии исключений RejectedExecutionHandler, а также четыре стратегии отклонения. Схема отношений выглядит следующим образом:
Это отражено во фреймворке.Согласно собственному бизнес-сценарию, вы можете разумно выбрать стратегию исключения пула потоков.
Пример трансформации бизнеса
В реальных бизнес-сценариях шаблон стратегии по-прежнему часто применяется.
Обмен продуктами в социальной электронной коммерции является очень важной частью.Предположим, мы хотим реализовать функцию обмена изображениями.Например, существуют различные сценарии обмена, такие как один продукт, несколько продуктов, размещение заказа, место проведения, приглашение и ссылка на апплет.
Для интерактивной блок-схемы сначала используйте оператор if else, чтобы сделать общее суждение о бизнес-коде, например, следующий метод:
public class SingleItemShare {
// 单商品
public void algorithm(String param) {
System.out.println("当前分享图片是" + param);
}
}
public class MultiItemShare {
// 多商品
public void algorithm(String param) {
System.out.println("当前分享图片是" + param);
}
}
public class OrderItemShare {
// 下单
public void algorithm(String param) {
System.out.println("当前分享图片是" + param);
}
}
public class ShareFactory {
public static void main(String[] args) throws Exception {
Integer shareType = 1;
// 测试业务逻辑
if (shareType.equals(ShareType.SINGLE.getCode())) {
SingleItemShare singleItemShare = new SingleItemShare();
singleItemShare.algorithm("单商品");
} else if (shareType.equals(ShareType.MULTI.getCode())) {
MultiItemShare multiItemShare = new MultiItemShare();
multiItemShare.algorithm("多商品");
} else if (shareType.equals(ShareType.ORDER.getCode())) {
OrderItemShare orderItemShare = new OrderItemShare();
orderItemShare.algorithm("下单");
} else {
throw new Exception("未知分享类型");
}
// .....省略更多分享场景
}
enum ShareType {
SINGLE(1, "单商品"),
MULTI(2, "多商品"),
ORDER(3, "下单");
/**
* 场景对应的编码
*/
private Integer code;
/**
* 业务场景描述
*/
private String desc;
ShareType(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public Integer getCode() {
return code;
}
// 省略 get set 方法
}
}
Здесь видно, что каждый раз, когда вы добавляете новый тип шаринга, нужно добавлять суждение if else, если сценариев больше десятка, то общий код будет очень длинным, да и выглядит не очень удобно.
Далее давайте посмотрим, как использовать шаблон стратегии для рефакторинга:
public interface ShareStrategy {
// 定义分享策略执行方法
void shareAlgorithm(String param);
}
public class OrderItemShare implements ShareStrategy {
@Override
public void shareAlgorithm(String param) {
System.out.println("当前分享图片是" + param);
}
}
// 省略 MultiItemShare以及SingleItemShare策略
// 分享工厂
public class ShareFactory {
// 定义策略枚举
enum ShareType {
SINGLE("single", "单商品"),
MULTI("multi", "多商品"),
ORDER("order", "下单");
// 场景对应的编码
private String code;
// 业务场景描述
private String desc;
ShareType(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
// 省略 get set 方法
}
// 定义策略map缓存
private static final Map<String, ShareStrategy> shareStrategies = new HashMap<>();
static {
shareStrategies.put("order", new OrderItemShare());
shareStrategies.put("single", new SingleItemShare());
shareStrategies.put("multi", new MultiItemShare());
}
// 获取指定策略
public static ShareStrategy getShareStrategy(String type) {
if (type == null || type.isEmpty()) {
throw new IllegalArgumentException("type should not be empty.");
}
return shareStrategies.get(type);
}
public static void main(String[] args) {
// 测试demo
String shareType = "order";
ShareStrategy shareStrategy = ShareFactory.getShareStrategy(shareType);
shareStrategy.shareAlgorithm("order");
// 输出结果:当前分享图片是order
}
}
Здесь модель стратегии была преобразована. На стороне клиентского запроса вообще не так много, если еще суждений.Вам нужно только передать соответствующий метод стратегии.Здесь мы поддерживаем карту кеша стратегии.Когда напрямую вызываемая ShareFactory получает стратегию, она напрямую меняется с Gets объект класса политики.
Это привело к идее поведенческой развязки. Это также позволяет избежать длинных строк суждений if else.
преимущество:
- Алгоритмические стратегии можно свободно переключать
- Хорошая масштабируемость, добавьте стратегию, нужно только добавить класс
недостаток:
- Множество стратегий
- Необходимо поддерживать перечисление стратегий, чтобы другие знали, какие стратегии у вас есть в настоящее время.
Суммировать
Вышеприведенное является концом шаблона стратегии. Общий вид на самом деле относительно прост. Это по-прежнему одно и то же предложение для изучения шаблонов проектирования. Нам все еще нужно изучить идеи каждого шаблона проектирования. Любой тип шаблона проектирования является разумным. Конечно, не проектируйте код из-за шаблонов проектирования, которые перевесят выгоды.
Я Ао Бин,Чем больше вы знаете, тем больше вы не знаете, спасибо за ваши таланты:как,собиратьиКомментарий, увидимся в следующий раз!
Статья постоянно обновляется, вы можете искать в WeChat "Третий принц Ао Бин"Прочтите это в первый раз, ответьте [материал] Подготовленные мной материалы интервью и шаблоны резюме крупных заводов первой линии, эта статьяGitHub github.com/JavaFamilyОн был включен, и есть полные тестовые сайты для интервью с крупными заводами.Добро пожаловать в Star.