Паттерны поведения пользователей / Хабр
Поведение любых живых организмов, будь то инфузория или даже человек, не так уж и трудно предсказать. Для этого не нужно быть экстрасенсом. Главное — правильно классифицировать объект исследования. Итак, тема, на которую я хотел бы сегодня поговорить — паттерны поведения пользователей и их использование.
Паттерны как основа всего
Все мы, так или иначе, встречали паттерны (шаблоны) в реальной жизни. Но некоторые даже понятия не имеют насколько они распространены в нашей жизни. Их можно даже назвать божественными, т.к., согласно Библии, Адам был создан по образу и подобию бога.
Сотворение Адама, Микеланджело
Если же придерживаться теории Дарвина, то и тут найдется очень много примеров их использования. Вспомните, например, курс школьной биологии, в котором говорилось о сходстве зародышей животных на первых этапах развития, когда почти невозможно отличить эмбрион человека от, допустим, эмбриона черепахи.
Сравнение зародышей различных видов животных
Логично будет предположить, что сходство не будет ограничиваться только первоначальным видом, но будет применяться и в дальнейшем. Это может касаться нервной системы, процесса пищеварения, а так же поведения.
Все эти паттерны необходимы для одного — упростить процесс создания, ведь гораздо легче наладить конвейерный процесс, нежели постоянно изобретать велосипед, особенно если дело касается частично похожих задач.
При правильной классификации можно так же легко и предугадать, как теоретически может создаваться какой-либо объект, а так же как он будет себя вести в некоторых ситуациях.
Паттерны в психологии
Паттерны, или, точнее, классификация, наверное, является основой всех наук. Классификация помогает ученым объяснять изучаемые области и строить теории для дальнейших изучений.
Психология не стала исключением. Вы наверняка слышали про социотипы и типы темперамента, экстравертов и интровертов.
4 типа темперамента
Все это является попыткой классифицировать людей. Поняв, к какому именно типу относится человек, психолог может предугадать дальнейшие его действия и мысли. На основе полученной информации специалист пытается направить пациента к принятию какого-то решения, либо к ответу на вопрос, который он сам себе задает, но ответить по каким-то причинам не может. В идеале пациент сам должен прийти к конечному пункту.
Похожим образом поступают экстрасенсы и прочие сторонники паранормального. По своей сути их работа практически не отличается от работы психолога. За исключением элемента «мистики», которая помогает людям найти канал для нахождения интересующего их в глубине сознания ответа, когда этот самый ответ как будто бы дает третье лицо. Как пример можно рассмотреть разговоры с умершим близким. В начале экстрасенс задает наводящие вопросы об объекте, о его окружении, причинах смерти и т.д. Это необходимо для того, чтобы нащупать ту самую нить, которая позволит найти слабое место клиента. В итоге экстрасенс под видом переводчика с языка потустороннего мира говорит клиенту то, что он хочет слышать для успокоения (для примера можете открыть любую серию «Битвы экстрасенсов» или другого шоу про экстрасенсов).
Мы же не будем вдаваться в мистику и просто попытаемся применить некоторые знания психологов для работы с пользователями.
Классификация пользователей
В эпоху, когда интернет может встретиться даже в вашем холодильнике, человек частично обезличился. В интернете никто не узнает, что ты кот.
Однако, на другом конце провода все равно находится человек (до тех пор, пока системами ИИ не будет пройден тест Тьюринга, но и тогда не все будет потеряно), который имеет свои привычки, вкусы, взгляды и страхи. Основываясь на них мы, подобно психологам, можем как предсказать его поведение, так и манипулировать им. В качестве одной из основ классификаций поведения пользователей в интернете возьмем привычную нам модель поведений — темпераменты.
Адаптируем ее под реалии веба:
- Холерики — активисты. Как правило, такие пользователи хотят скорее получить все для него необходимое от вашего продукта. Они не любят тратить время. Что-то искать, находить, разбираться — не в их привычках.
- Флегматики — неспешные. Прежде чем выполнить какое-нибудь действие обязательно разбираются. Могут читать соглашения, все тексты на всплывающих окнах. Готовы посвятить свое время на изучение продукта, но только в том случае, если этим действительно необходимо.
- Сангвиники — горячие. Таких пользователей всегда нужно держать в тонусе, т.к. при потере интереса он попросту «сливается». Подобно холерикам, быстро реагируют на всю поступающую информацию. Отличие — легко принимают собственные ошибки.
- Меланхолики — боязливые. Боятся совершить ошибку. При возникающей проблеме или сложном действии предпочитают не разбираться, а просто закрыть и забыть. Такие пользователи обычно не выбирают оплату картой прямо на сайте, т.к. боятся, например, ошибиться при вводе данных.
В идеале, при проектировании продукта необходимо учитывать все эти типы (конечно, за некоторым исключением). Однако, не стоит переусердствовать, ведь, как известно, всем сразу не угодишь. На первых этапах развития лучше всего взять слабые стороны всех типов и по максимуму устранить возможность их появления.
Дорога из желтого кирпича — карта поведений
Помочь аналитикам, проектировщикам и маркетологам в разделении своих пользователей на группы может прийти карта поведений и классификаций. С помощью этой карты нужно группировать пользователей по определенным признакам (половым, возрастным и т.д.), а так же прописать соответствующее поведение для этих групп.
Для небольшого примера возьмем бизнес по продаже футболок с принтами в интернет-магазине. Составим первоначальный образ типичного покупателя — молодой парень или девушка возрастом от 16 до 30. Итак уже на первом шаге у нас образовывается небольшая классификация:
Так, уже можно работать с этими двумя классами. Можно, к примеру, строить простые логические цепочки следующего вида:
Если пользователь — мужчина (смотрит мужские футболки), то предлагать ему мужские футболки.
Пусть мало, зато у нас уже есть входные данные. Пойдем дальше. Интернет-магазин готов, футболки поступили на склад. Состоится открытие. Спустя время выясняется, что женская часть аудитории помимо женских смотрит и мужские футболки. Предполагаем, что девушки смотрят футболки в подарок своим молодым людям. Мужская же часть пользователей время от времени проявляет интерес к футболкам определенной тематики, например, хоккей и комиксы. Для первого случая делаем вывод, что в интернет-магазине необходим блок «В подарок парню», где выведем самые популярные футболки. Второй случай мы привязываем к выходу очередного фильма от Марвел или ДС, и к началу чемпионата. Следовательно, мужская часть аудитории покупает футболки с принтами какого-то массового события. В карту классификации наших клиентов добавляются несколько блоков.
Таким образом, с развитием вашего бизнеса, карта будет расширяться, вы будете делать новые предположения о том, как буду вести себя ваши пользователи, о том, как повлиять на ту или иную группу покупателей. Чем больше данных вы будете получать, тем больше вы будете знать о ваших покупателях, тем точнее вы можете организовывать ваши рекламные кампании.
Вместо заключения
Описанные в статье примеры — лишь попытка показать, в каком направлении можно «копать» при проектировании своего продукта. Не нужно забывать, что ваше решение может иметь специфичную аудиторию, которая может вести себя совершенно наоборот.
Самым лучшим вариантом будет выяснить для себя, кому примерно будет интересно ваше предложение, найти похожего человека (потенциального клиента) и просто пообщаться с ним. Это и может послужить отправной точкой.
Паттерны (шаблоны) поведения. Виды паттернов поведения
Паттерны » Паттерны поведения
Паттерны поведения рассматривают вопросы о связях между объектами и распределением обязанностей между ними. Для этого могут использоваться механизмы, основанные как на наследовании, так и на композиции.
Кратко рассмотрим особенности паттернов (шаблонов) поведения.
Паттерн Chain of Responsibility позволяет обработать запрос нескольким объектам-получателям. Получатели связываются в цепочку, и запрос передается по цепочке, пока не будет обработан каким-то объектом. Паттерн Chain of Responsibility позволяет также избежать жесткой зависимости между отправителем запроса и его получателями.
Паттерн Command преобразовывает запрос на выполнение действия в отдельный объект-команду. Это придает системе гибкость: позволяет осуществлять динамическую замену команд, использовать сложные составные команды, осуществлять отмену операций.
Паттерн Iterator предоставляет механизм обхода элементов составных объектов (коллекций) не раскрывая их внутреннего представления.
Паттерн Interpreter предназначен для решения повторяющихся задач, которые можно описать некоторым языком. Для этого паттерн Interpreter описывает решаемую задачу в виде предложений этого языка, а затем интерпретирует их.
Паттерн Mediator инкапсулирует взаимодействие совокупности объектов в отдельный объект-посредник. Уменьшает степень связанности взаимодействующих объектов — им не нужно хранить ссылки друг на друга.
Паттерн Memento получает и сохраняет за пределами объекта его внутреннее состояние так, чтобы позже можно было восстановить объект в таком же состоянии.
Паттерн Observer определяет зависимость «один-ко-многим» между объектами так, что при изменении состояния одного объекта все зависящие от него объекты уведомляются и обновляются автоматически.
Паттерн State позволяет объекту изменять свое поведение в зависимости от внутреннего состояния. Создается впечатление, что объект изменил свой класс. Паттерн State является объектно-ориентированной реализацией конечного автомата.
Если поведение системы настраивается согласно одному из некоторого множества алгоритму, то применение паттерна Strategy переносит семейство алгоритмов в отдельную иерархию классов, что позволяет заменять один алгоритм другим в ходе выполнения программы. Кроме того, такую систему проще расширять и поддерживать.
Паттерн Template Method определяет основу алгоритма и позволяет подклассам изменить некоторые шаги этого алгоритма без изменения его общей структуры.
Паттерн Visitor определяет операцию, выполняемую на каждом элементе из некоторой структуры без изменения классов этих объектов.
Паттерны поведения. Феникс. Терапевтические паттерны Милтона Эриксона
Паттерны поведения
В форте Беннинг, штат Джорджия, я тренировал команду снайперов для международных командных соревнований по стрельбе. Однажды я обедал в зале войсковой столовой с двумя лейтенантами, и тут вошли несколько человек, и я заметил, как одна девушка взяла поднос и стала оглядывать столовую в поисках подходящего столика. Она прошла мимо нескольких столиков, где были свободные места… и села туда, где она могла сидеть с западной стороны столика. Я сказал лейтенантам: «Эта девушка — единственный ребенок в семье». Они спросили: «Откуда вы знаете?» — «Я вам скажу, только сначала проверьте, так ли это». Они пошли и спросили ее, правда ли, что она единственный ребенок в семье… и она ответила: «Да». Она поинтересовалась, почему они ее об этом спрашивают. И они сказали: «Вон тот доктор сказал, что вы единственный ребенок». — «А кто это?» Они назвали ей мое имя. «Я никогда о нем не слышала». Они вернулись… как же я узнал, что она единственный ребенок? Она оглядывала столовую в поисках столика, где она могла сесть, и в результате нашла столик, где свободной была западная сторона. Потому что дома папа сидел вот здесь, мама сидела здесь, а ей оставалось сесть здесь. В поведении людей множество. паттернов, и не пытайтесь все их сформулировать. Просто ждите, и вы увидите, как они будут проявлять себя.
Когда вы видите человека, протягивающего вам правую руку, ладонь которой ребром обращена к поверхности земли, этот жест вызывает у вас симметричную последовательность, или «паттерн», форм поведения, в соответствии с которым вы протягиваете свою правую руку, сжимаете руку другого человека и начинаете трясти ее вверх-вниз. Рукопожатие определенно не является примером особенно глубокомысленного или сложного поведения, однако оно ЯВЛЯЕТСЯ примером поведения, структурированного в виде паттерна. Под поведением, структурированным в виде паттерна, мы понимаем тот факт, что рукопожатие обладает некоторым качеством, позволяющим систематически вызывать определенный результат (в частности, устанавливать определенного рода раппорт). Протягивание руки описанным выше способом любому представителю нашей культуры практически неизменно вызовет определенную совокупность симметричных реакций со стороны этого человека, а именно — пожатие вашей руки. Таким образом, мы можем сказать, что это пример (культурного) поведенческого паттерна в том смысле, что он предсказуемым образом описывает результат некоторой последовательности форм поведения.
Диапазон форм опыта, на который распространяется структурированное подобным образом поведение, в действительности значительно шире и тоньше, чем такие с очевидностью запрограммированные формы поведения, как рукопожатие, раскуривание сигареты, нажатие на тормоз при виде красного света и т. д. Формы поведения, включающие развернутые когнитивные процессы и осознание, а также более сложные формы внешнего поведения (такие, как наступление и развитие депрессии) или же тонкие, неосознанные формы поведения (скажем, моргание при произнесении некоторых слов), столь же жестко структурированы, как и простые «привычки». На самом деле основная часть нашего поведения в высшей степени структурирована. Если вы на минуту задумаетесь о поведении членов вашей семьи или друзей в аналогичных контекстах, этот факт станет для вас очевидным. Возьмем, к примеру, еду. Некоторые люди практически всегда разрезают всю поданную им пищу на кусочки, а уже потом едят, а другие практически всегда отрезают и едят по кусочку. Одни едят быстро, другие — медленно. Одни смотрят в меню и выбирают первое блюдо, которое кажется им привлекательным, а другие не могут принять решение до тех пор, пока официант не спросит их, что им принести. Очевидно, что подобных вариаций существует бесчисленное множество. Суть же в том, что разные люди в одинаковых контекстах демонстрируют различные формы поведения и что большая часть их форм поведения в рамках определенного контексты будет повторяйся раз, когда они в очередной раз окажутся в рамках этого контекста. Иными словами, их поведение структурировано в виде паттернов. Распространите ваши размышления на любой контекст, и вы обнаружите неизменные закономерности в вашем собственном поведении и в поведении других людей.
В большинстве случаев эти поведенческие паттерны обеспечивают нам значительное преимущество, заключающееся в том, что нам не приходится сознательно отслеживать и направлять шаги, из которых состоят практически все наши действия — открывание двери, завязывание шнурков или заказ еды в ресторане. Если бы вы каждый раз задумывались о том, как вам открыть дверь, завязать шнурки или быстро выбрать блюдо, решение этих задач было бы бесконечно обременительным и крайне неэффективным (более того, если бы вы могли генерировать поведенческие альтернативы при выполнении подобного рода задач чересчур обильно, вам грозила бы опасность навеки застрять перед закрытой дверью и умереть от голода, так и не завязав шнурки). Выстраивание большинства форм нашего поведения в жестко структурированные последовательности освобождает сознательную часть нашей психики, позволяя использовать ее для других, более интересных размышлений (так, завязывая шнурки, вы можете думать о предстоящем свидании, а не о том, какой узел вам завязать). Некоторые из наших поведенческих паттернов представляют собой общепринятый культурный опыт — к их числу относится рукопожатие, тогда как многие другие паттерны являются в высшей степени индивидуальными — к ним можно отнести пристрастие начинать бритье с верхней губы, надевание сначала брюк, а потом рубашки, ожидание того, что вас пригласят на свидание, и отказ проявить инициативу, предоставление супругу права выбора фильма для просмотра и многое другое.
Как часто семейные проблемы представляют собой сущие пустяки. Супружеские пары обращаются ко мне и говорят… мы любим друг друга и наслаждаемся сексом, но когда мы пытаемся заснуть… каждая ночь заканчивается жутким скандалом. Каждую ночь, когда мы пытаемся уснуть, мы начинаем ссориться. А ведь мы любим друг друга, наша сексуальная жизнь в полном порядке, но когда мы ложимся спать, мы начинаем ссориться. И какая мысль первой приходит вам в голову? Как вы думаете, из-за чего они ссорятся? Я говорю им: «Вы оба выросли с привычкой спать на правой стороне постели или на левой стороне — поэтому вы и ссоритесь, когда ложитесь спать, что либо ВЫ оказываетесь на неудобной для вас стороне постели, либо ОН». В моей собственной семье тоже был случай, когда Майк и Арчи спали однажды ночью в одной постели, а оба они привыкли спать на правой стороне. О, какой скандал закатили Арчи и Майк, пытаясь устроиться поудобнее! То Арчи спал на правой стороне, и тогда Майк оказывался не с той стороны, то наоборот, и они никак не могли успокоиться.
Одним из способов размышления о ситуации клиента является рассмотрение возможности того, что он использует паттерн поведения, неэффективный или неадекватный в контексте, в котором используется этот паттерн. К примеру, если человек все время «предоставляет супруге право решать, какой фильм смотреть, то в контексте супружеских отношений этот паттерн вполне уместен; но если этот человек будет использовать тот же паттерн в обществе своих коллег на заседаниях правления компании, его репутация окажется под угрозой. Если он желает оказывать какое-либо влияние на будущее своей компании, то должен уметь открыто выражать свое мнение о том, в каком направлении ей следует развиваться. Аналогичным образом пианист, которого охватывает при выходе на сцену такой страх, что он не может играть, использует паттерн поведения, который, возможно, являлся бы полезным, если бы его попросили выполнить некую физически опасную задачу (к примеру, полететь на дельтаплане без предварительной подготовки), однако в контексте фортепианного концерта он неуместен. Таким образом, наша задача — не избавиться от некоторых форм поведения, а контекстуализировать их уместным образом, ограничивая эти формы поведения теми сферами, где их использование уместно, а также формируя или вызывая паттерны поведения, уместные в других контекстах. С точки зрения поведенческих изменений член правления компании добивается от вас как от своего психотерапевта изменения паттерна его поведения таким образом, чтобы в контексте заседаний правления он мог заявить о своих предпочтениях, а пианист хочет обрести способность без страха выходить на сцену и исполнять свою программу.
Чем же в таком случае определяется то, когда человек демонстрирует тот или иной КОНКРЕТНЫЙ паттерн поведения? Существует несколько способов ответить на этот вопрос. Одним из них является указание на то, что индивиды демонстрируют те паттерны поведения, которые они сами обучились использовать в данном контексте или которым их научили другие люди. К примеру, вас в раннем возрасте могли научить уступать желаниям других, когда возможен выбор вариантов. Другой способ объяснить систематическое проявление поведенческих паттернов — указать на то, что они являются логическим следствием совокупности обобщений, которыми руководствуется человек в рамках конкретного контекста. К примеру, убеждение в том, что другие люди будут любить вас, если вы будете уступать их желаниям, может найти внешнее выражение в передаче выбора другим. В первом случае реакции человека в рамках определенного контекста являются функцией форм поведения, которые были им сформированы или усвоены, тогда как во втором его реакции являются функцией совокупности убеждений или обобщений, приобретенных тем или иным способом. Разумеется, ни одно ни другое описание не является однозначно верным, — это две стороны одной медали. Когда опыт (либо в форме прямых указаний, либо в форме благоприятного стечения обстоятельств) моделирует ваше поведение в рамках определенного контекста, наряду с новыми поведенческими привычками формируются обобщения и критерии, конгруэнтные данным формам поведения. И напротив, изменение ваших обобщений или критериев в отношении определенного контекста приведет к поведенческим изменениям, конгруэнтным этим изменениям в вашей модели мира. Иными словами, то, каким образом вы будете реагировать (вести себя) в данном контексте, будут определять ваши убеждения относительного того, что хорошо, а что плохо, что полезно, а что вредно, что интересно или важно, а что опасно в конкретном контексте.
Таким образом, тот референтный опыт (критерии/убеждения/ обобщения), в пользу которого вы будете производить сортировку, в значительной степени определит характер уместного поведения в рамках соответствующего контекста, однако верно также и то, что поведенческий опыт модифицирует существующие обобщения или формирует новые (посредством пересортировки критериев). Предметом рассмотрения предыдущей главы являлось то, как Эриксон использовал точки зрения своего клиента (то есть его референтный опыт) в качестве средства для изменения его привычного поведения и достижения за счет этого более глубоких изменений. В этой главе мы рассмотрим то, как Эриксон использует паттерны поведения клиента с целью полезного изменения его точки зрения и за счет этого добивается более глубоких изменений.
Развитие способности производить вмешательство, идущее на благо вашего клиента, либо благодаря задействованию его модели мира, либо благодаря использованию его паттернов поведения, придаст вашей работе гибкость и глубину, что является очевидным преимуществом. Как же нам в таком случае выделить нужный паттерн поведения среди огромного количества поведенческой и вербальной информации, предоставляемой вашим клиентом? Чтобы ответить на этот вопрос, нужно сначала провести различение между содержанием проблемы и организацией этого содержания в форме паттернов.
10 основных когнитивных и поведенческих паттернов UX-дизайна — UXPUB
В этой статье представлен ряд наиболее распространенных видов поведения, которые проявляют люди по отношению к дизайну продукта. Продукт, поддерживающий эти паттерны, поможет пользователям эффективно и быстро достичь своих целей.
При проектировании любого продукта важно понимать ожидания пользователей в отношении принципов его работы. Если мы создаем наш продукт в вакууме, не принимая во внимание существующие на рынке продукты, а также психологию и культуру наших пользователей, то ваш продукт обязательно оставит их в замешательстве и разочаровании.
Я узнал об этих паттернах из книги «Проектирование интерфейсов: Паттерны эффективного дизайна взаимодействий». Приведенные ниже цитаты были взяты из этой книги, и я настоятельно рекомендую вам приобрести ее, если хотите подробнее изучить этот вопрос.
1. Безопасное исследование
«Позвольте мне исследовать, не теряясь и не попадая в неприятности».
«Когда кому-то кажется, что он может исследовать интерфейс и не страдать от тяжелых последствий, он, вероятно, узнает больше – и будет чувствовать себя более позитивно – чем пользователь, который не исследует интерфейс. Хорошее программное обеспечение позволяет людям пробовать что-то незнакомое, отступать и пробовать что-то другое, и все это без стресса».
В отличие от реального мира, интерфейсы позволяют пользователям легко исправлять свои ошибки. Если вы прольете кофе на юбку, значит, вы облажались – вы не можете нажать CTRL + Z. Дизайны интерфейсов, напротив, должны побуждать пользователей изучать различные доступные варианты, а затем вернуться туда, где они начали, или легко отменить любые действия.
Примеры:
- Кнопки назад, позволяющие легко вернуться туда, где я начал
- Применение фотофильтров, которые можно легко отменить, если мне не понравится результат
- Сохранение истории
- Кнопки «Отменить» для документов
2. Мгновенное удовлетворение
«Я хочу сделать что-то сейчас, а не позже».
«Людям нравится видеть немедленные результаты от действий, которые они предпринимают – это в человеческой природе. Если пользователь начинает использовать приложение и получает «успешный опыт» в течение первых нескольких секунд, это приятно! Он с большей вероятностью продолжит использовать его, даже, если позже это станет труднее. Он будет чувствовать себя более уверенным, чем, если бы ему потребовалось время, чтобы разобраться в приложении».
В нашем быстро меняющемся цифровом мире все становится намного быстрее и проще. Голодны? Доставка еды на дом за 30 минут или меньше. Нужно ехать? Uber в нескольких минутах от вас. Хотите свидание? Вы можете найти потенциальную пару в считанные секунды в приложениях для знакомств. Список можно продолжать…
Если наш продукт не обеспечивает мгновенную порцию дофамина, то существует риск, что пользователь выберет продукт конкурента. Подумайте, как дать своим пользователям чувство удовлетворения или достижения в этом опыте.
Примеры:
- Подбор совпадений в приложении знакомств
- Взрыв конфетти, когда вы формируете привычку
- Вызов Uber
- Hitting the snooze button
3.
Довольствоваться минимумом«Это достаточно хорошо. Не хочу больше тратить время на обучение, чтобы делать это лучше».
«Когда люди смотрят на новый интерфейс, они не читают методично каждый его фрагмент. Вместо этого они быстро просканируют интерфейс, сначала выберут все, что увидят, чтобы получить желаемый результат, и попробуют – даже, если они ошибаются».
«Люди готовы принять «достаточно хороший» результат вместо «лучший», если изучение всех альтернатив может стоить времени или усилий».
Вы когда-нибудь быстро сканировали целевую страницу, не читая дальше заголовка, а потом решив, что это не для вас? Я тоже – всегда так делаю. Мы подсознательно и сознательно воспринимаем продукт, и оцениваем, может ли он решить нашу проблему, сделать нашу жизнь лучше или соответствует ли он нашим стандартам.
Сделайте наиболее важную информацию простой для вашего пользователя, чтобы он понял ее с первого взгляда. Если вы будете думать, что люди будут читать большие блоки текста, чтобы понять, как ваш продукт может принести им пользу, то вы потеряете большинство потенциальных пользователей.
Ключевые моменты:
- Сделайте очевидные варианты, которые пользователь может безопасно выбрать
- Интерфейс должен быть легко сканируемым
- Пользователи будут искать первый подходящий вариант
4. Отложенный выбор
«Я не хочу отвечать на это сейчас; просто дайте мне закончить!»
«Это вытекает из стремления людей к мгновенному удовлетворению. Если в процессе вы задаете пользователю, ориентированному на задачe, ненужные вопросы, он может предпочесть пропустить вопросы и вернуться к ним позже. Например, некоторые веб-доски объявлений имеют длинные и сложные процедуры регистрации пользователей. Названия экранов, адреса электронной почты, настройки конфиденциальности, аватары, описания… список можно продолжать и продолжать. «Но я просто хотел опубликовать небольшое объявление», – говорит пользователь.
«Почему бы не позволить им пропустить большую часть вопроса, ответить на самый минимум и вернуться позже (если вообще вернуться), чтобы заполнить остальные? В противном случае они могут потратить полчаса, отвечая на вопросы эссе и выбирая идеальное изображение для аватара».
Мы, UX-дизайнеры, должны подумать, где можно сократить форму. Не запрашивайте ненужную информацию, но, что более важно, разрешите ввод информации позже или сделайте ее необязательной.
Все, что не обязательно, должно быть пропущено.
Ключевые моменты:
- Не делайте слишком много шагов
- Разрешите пользователям «пропускать» вопросы
- Отделяйте важные вопросы от второстепенных
- Разрешите пользователям добавлять, изменять или редактировать ответы позднее
5. Привыкание
«Этот жест работает везде; почему здесь он не работает?»
«При многократном использовании интерфейса часто повторяющиеся физические действия становятся рефлекторными: нажатие Ctrl-S для сохранения документа, нажатие кнопки «Назад» для выхода из веб-страницы, нажатие «Return» для закрытия модального диалогового окна, использование жестов для отображения и скрытия окон – даже нажатие педали тормоза в автомобиле. Пользователю больше не нужно сознательно думать об этих действиях. Они стали привычными».
Как человек, который ежедневно использует Figma, XD и Sketch, я впечатлен тем, насколько унифицировано большинство элементов управления, но все же раздражаюсь из-за различий.
Если существует отраслевой стандарт для взаимодействия или интерфейса, то лучше придерживаться его – перепроектирование существующих паттернов запутает пользователя. Приберегите свою креативность для других аспектов продукта.
Примеры:
- CTRL + S, CTRL + Z
- Смахивание влево или вправо, чтобы перейти к следующему или предыдущему экрану
- Нажмите X, чтобы выйти из диалогового окна
- Смахните вниз, чтобы обновить экран на мобильном телефоне
6. Пространственная память
«Клянусь, эта кнопка была здесь минуту назад. Куда она делась?
«Когда люди манипулируют объектами и документами, они часто находят их позже, вспоминая, где они находятся, а не как они называются».
«Пространственная память объясняет, почему хорошо предоставлять пользователям области для сортировки документов и объектов, например, рабочий стол. Они не всегда практичны, особенно с большим количеством объектов, но довольно хорошо работают с небольшим количеством объектов. Когда люди сами упорядочивают вещи, они, скорее всего, вспомнят, куда это положили».
Думайте о своем приложении как о физическом пространстве. Люди будут организовывать вещи, как им удобно, а не как считает ваш алгоритм. Сделайте так, чтобы пользователи могли легко переставлять вещи и делать закладки на потом.
Примеры:
- Группировка приложений в папки
- Организация программ на рабочем столе
- Сортировка карт в кошельке Apple
7. Социальное доказательство
«Что другие говорили об этом?»
«Люди социальны. Каким бы сильным не было наше мнение, на нас, как правило, влияет то, что говорят или делают коллеги. И мы настроены на получение одобрения от других и стремимся принадлежать к группе. Мы поддерживаем идентичность в социальных сетях. Мы помогаем группам и людям, которые нам дороги».
Социальное доказательство может сделать ваш продукт более привлекательным. Не обязательно добавлять друзей пользователя, хотя это возможно. Отображение популярных элементов заставит ваших пользователей чувствовать себя менее одинокими при принятии решений. Если другие решили что-то сделать и остались довольны своим выбором, то высок шанс, что это разумный вариант.
Никто не хочет вступать в заброшенное сообщество – один из моих любимых примеров – Reddit. Основатели Reddit создали сотни фейковых профилей, чтобы сайт выглядел популярным.
Примеры:
- Обзоры на Amazon, Airbnb, Yelp и т.д.
- Лайки, реакции, публикации, ретвиты, подписчики, количество друзей, синяя галочка подтверждённого аккаунта, комментарии или просмотры.
- Советы или рекомендуемые товары от друзей
- «48 вашим друзьям нравится эта страница»
8. Организованное повторение
«Сколько раз я должен это повторить?»
Во многих приложениях пользователям иногда приходится выполнять одну и ту же операцию снова и снова. Чем проще это будет для них, тем лучше. Если вы можете сократить операцию до одного нажатия клавиши или клика за повторение – или, что еще лучше всего, до нескольких нажатий клавиш или кликов за все повторения – вы избавите пользователя от монотонной работы».
В своей первой компании я много занимался обслуживанием клиентов и постоянно копировал из документа одни и те же общие ответы. В конце концов я решил, что должен быть лучший способ. Он был – я нашел расширение Chrome, которое использовало text shortcut для автозаполнения ответов. Если бы я набрал «greet%», он автоматически вставил бы мое приветственное сообщение (greeting message).
Это сэкономило мне огромное количество времени и помогло мне осознать важность оптимизации пользовательского опыта для часто повторяющихся действий.
Если ваши пользователи постоянно повторяют одну и ту же команду или действие – создайте горячую клавишу или рабочий процесс, чтобы облегчить им жизнь.
Примеры:
- Автозаполнение, когда вы начинаете печатать текст
- Google Chrome автоматически выполняет запрос «yo» для www. youtube.com
- Автоматизация рутинных процессов в Slack с помощью Workflow Builder
- Кнопки «Удалить все» или «Выбрать все»
9. Проспективная память
«Я помещаю это сюда, чтобы напомнить себе, сделать это позже».
«Мы задействуем проспективную память, когда планируем что-то сделать в будущем, и решаем, как напомнить себе об этом. Например, если завтра вам нужно принести на работу книгу, вы можете поставить ее на столе рядом с входной дверью накануне вечером. Если вам необходимо ответить на письмо позже, вы можете оставить это письмо открытым на экране в качестве напоминания».
Проспективная память не слишком часто появляется в интерфейсах, но это важный паттерн, который нужно учитывать при проектировании. Инфраструктура для проспективной памяти – это самое главное. Возможность сохранять черновики, напоминание о чем-либо позже или размещение незавершенных задач в удобном для поиска месте поможет пользователю, когда он вернется к задаче.
Примеры:
- Оставлять окна программ открытыми, как напоминание, что какая-то задача должна быть завершена
- Помечать письмо звездочкой или отмечать его, как непрочитанное
- Добавление сайтов в закладки
- Выделение текста в документе в качестве напоминания пересмотреть его позже
10.
Микроперерывы«Я жду поезда. Позвольте мне сделать что-нибудь полезное в течение двух минут».
«Люди часто находят несколько свободных минут. Им может понадобиться умственный перерыв во время работы; они могут стоять в очереди в магазине или сидеть в пробке. Они могут скучать или проявлять нетерпение. Они хотят сделать что-то конструктивное или интересное, чтобы скоротать время, зная, что у них будет недостаточно времени, чтобы углубиться в онлайн-активность».
Ваш интерфейс должен побуждать пользователей использовать его в те свободные 2 минуты, которые они проводят в лифте. Сделайте легким и быстрым изучение, развлечение или поиск необходимой информации. Это возвращает нас к мгновенному удовлетворению – если пользователь уверен, что ваше приложение доставит ему быстрый восторг, он будет возвращаться к нему снова и снова.
Примеры:
- Скроллинг в Instagram
- Чтение новостей
- Игры
- Ответ на сообщения
- Проверка почты
Подписывайтесь на Dribbble и Medium автора, и вы можете связаться с ней в LinkedIn.
3 поведенческих паттерна или что не так с вашим веб-дизайном?
Вам когда-нибудь казалось, что некоторые посетители вашего сайта невероятно ленивы. Девайс-инерция, импульсивное поведение и избирательное внимание — это три основные модели поведения людей, из-за которых интернет-пользователей и могут принимать как чересчур ленивых. Но даже это не основная причина нарушенного диалога между вашим ресурсом и посетителями: все дело в непроработанном интерфейсе, и дефицит усилий со стороны ваших потенциальных клиентов здесь не главное.
Когда мы замечаем, что у людей возникают какие-либо трудности при работе с сайтом, мы изо всех сил стараемся определить причину недопонимания и так усовершенствовать интерфейс ресурса, чтобы подобных ошибок больше не возникало. Но случалось ли с вами такое, что, изучая результаты очередного юзабилити-теста, вы приходили к выводу, что это не интерфейс сайта требует доработки, а сами люди должны быть немного умнее и сообразительнее, дабы чувствовать себя комфортно на вашем ресурсе?
Чувствуете, насколько это нелепо звучит. И все же нередко от веб-дизайнеров можно услышать подобные реплики, причем самое оскорбительное и, пожалуй, самое распространенное — называть своих пользователей «ленивыми». Ведь если дизайн предлагает все, что нужно, почему же люди не могут справиться с поставленными задачами? Ведь им достаточно всего лишь чуть больше прочитать, чуть больше прокрутить страницу, больше обратить внимание на определенный блок информации и вуаля — задача была бы решена.
Вместо того, чтобы обвинять пользователей, попытаемся понять мотивы их действий и определить, как создать такой интерфейс сайта, который учитывал бы все особенности поведения пользователей и предоставлял бы лучший пользовательский опыт.
В частности, будут рассмотрены 3 наиболее общих модели человеческого поведения, которые хоть и являются причиной недопонимания между рядовыми пользователями и дизайнерами, но все же представляют собой примеры наиболее эффективного поведения, для которого дизайнеры и должны разрабатывать свои интерфейсы. Они уже были названы в начале. Это:
- девайс-инерция;
- импульсивное поведение;
- избирательное внимание.
Имейте в виду, что все люди склонны принимать такие решения, которые потребуют от них минимум усилий. Все перечисленные варианты поведения типичны для ситуаций, когда воспринимаемая выгода от предлагаемого веб-ресурсом действия несравнима с объемом усилий, которые нужно совершить. При этом альтернативный вариант обычно расценивается как неэффективный (слишком затратный в плане усилий). Однако нередко, когда и этот альтернативный вариант пользователям не удается найти.
Девайс-инерция
Несколько лет назад Кара Пернис (Kara Pernice), старший вице-президент консалтингового агентства Nielsen Norman Group, и ее жених сидели дома и посредством смартфонов пытались найти лучшее напольное покрытие для ремонта своего дома. Но во время серфинга интернета они столкнулись с рядом UX-проблем (от англ. user experience — опыт пользовательского взаимодействия с веб-ресурсом или продуктом): не могли достаточно хорошо рассмотреть текстуру древесины, боролись с поисковыми фильтрами, чтобы увидеть желаемые виды полов, с трудом могли сравнить понравившиеся варианты на своих миниатюрных экранах. И каждый раз, когда они сталкивались с очередным неудобством, Кара говорила Стиву, что лучше бы посмотреть варианты на компьютере, но при этом продолжала всматриваться в крошечный экран iPhone.
Стив каждый раз поддерживал предложение своей невесты, но также продолжал просматривать страницу сайта через смартфон и пытался увеличить заинтересовавшие его варианты полов, довольствуясь весьма скромным результатом. Но странно было даже не то, что они так и не смогли оторваться от своих мобильных устройств и пересесть за более удобный девайс: в нескольких метрах от дивана, на котором они сидели, на столе лежали два под завязку заряженных планшета, а в дальней комнате — 2 ноутбука, подсоединенные к 32-дюймовым экранам.
Ситуацию, или вернее — модель поведения, когда человек продолжает использовать определенное устройство, при этом имея возможность без особого труда переключиться на другой, более удобный, для решения какой-либо задачи, Кара назвала девайс-инерцией.
Главная причина, почему девайс-инерция имеет место быть, — уже упомянутое нами свойство человека идти по пути наименьшего сопротивления и не принимать таких решений, которые требуют определенных усилий, тогда как сам результат этих усилий совсем не стоит. В приведенном выше примере результат — это более комфортный поиск: на больших экранах проще рассмотреть особенности продукта и сравнить их друг с другом. Но эта выгода потребует от вас ряда дополнительных действий: вам нужно будет включить компьютер, найти нужный сайт, отыскать на сайте понравившиеся варианты. Нежелание совершать вереницу всех этих действий и приводит к девайс-инерции: люди продолжают испытывать неудобства, но ничего с этим не делают.
Конечно, если бы человек подсчитал, сколько времени и сил бы сохранилось, перейдя на другое устройство, он бы так и поступил. Но только за исключением тех случаев, когда пользователю остается совершить только одно взаимодействие.
Мобильные телефоны и компьютеры являются очевидными конкурентами, но существуют и много других ситуаций, которые провоцируют девайс-инерцию. К примеру, использование мыши и клавиатуры. Или использование тачскрина и мыши.
Кара Пернис приводит пример, в котором человек, страдающий от ДЦП, имел возможность управлять курсором на экране компьютера, используя стрелки на клавиатуре и кликая на кнопки мыши. Клик переносил курсор на большое расстояние, а стрелки — на маленькое. Чтобы передвинуть курсор на другой конец экрана, человек кликал на мышку, а потом корректировал положение курсора стрелками на клавиатуре. И так каждый раз. Но бывали и такие ситуации, когда больной использовал только стрелки, хотя курсор необходимо было передвинуть на большое расстояние. Вместо того, чтобы кликнуть по мышке, а потом нажать на нужные клавиши, он предпочитал много раз жать на нужную стрелку просто потому, что его рука уже лежала на клавиатуре.
Девайс-инерция возникает и в многих других ситуациях. Например, бывает, что вы продолжаете смотреть определенный ТВ-канал, даже если он вам не нравится, просто потому, что вам лень дотянуться до пульта.
Импульсивное поведение
Суть этой модели поведения заключается в том, что люди, выполняя какую-либо задачу, будут продолжать использовать менее эффективный подход и не замечать более выгодный альтернативный, просто потому, что в самом начале они уже наметили маршрут решения задачи и придерживаются его.
Импульсивное поведение случается тогда, когда определенные элементы интерфейса недостаточно проработаны в плане привлечения внимания. Пользователи просто-напросто не видят и не замечают тех возможностей, которые предлагают им разработчики, а потому они формулируют свой способ решения задачи, как правило, более ресурсоемкий.
Еще одна возможная причина импульсивного поведения — факт, что не всегда люди ищут прямой маршрут достижения цели. Зачастую они избирают далеко не самый идеальный вариант решения проблемы просто потому, что не уверены, что другие варианты будут проще и не займут столько времени.
Импульсивное поведение проявляется тогда, когда выгода (которую человек получит по выполнении задачи) требует несоизмеримого с ее ценностью объема усилий. В этой ситуации люди считают, что изучать интерфейс и осваивать новую процедуру, которая хоть и удобнее, но требует времени и сил, не стоит своей выгоды, поэтому продолжают действовать уже хорошо освоенным и понятным методом.
Как вывод: разрабатывайте такие варианты взаимодействия с сайтом, которые, во-первых, будут действительно выгоднее, а во-вторых, заметнее.
Избирательное внимание
Избирательное внимание — это уже давно известная особенность человеческого поведения, при которой люди фокусируются на конкретном объекте и игнорируют постороннюю информацию, которую посчитали неуместной, нерелевантной их интересам. Например, представьте, что вы находитесь в шумном ресторане, где столики расположены очень близко друг к другу. Вы можете ясно слышать беседу людей, ужинающих за соседними столиками, но намеренно игнорируете их и старайтесь слышать только своего собеседника.
В зависимости от особенностей веб-дизайна, ситуации, характеристик самого пользователя и его прошлого опыта некоторые элемента интерфейса (полезные и не очень) могут быть проигнорированы. Избирательное внимание может как помочь пользователям, так и навредить им.
Вообразите ситуацию, в которой посетитель новостного сайта читает статьи и сообщения. Он так увлечен чтением, что не замечает удобной системы навигации в шапке сайта, но в данной ситуации этот инструмент ему и не нужен, поэтому никаких проблем это не вызовет. Но если тот же самый пользователь всерьез увлечется какой-либо темой и захочет прочитать о ней больше, он может и не заметить список связанных статей (Related Links), который разработчики разместили в футере, если зациклится на блоке «Прочитать больше статей этого автора». В этой ситуации, конечно же, юзер получит далеко не то, что он хотел изначально.
Избирательное внимание так же является результатом анализа затрат и выгод конкретного действия, но, вероятно, эта привычка уже давно укоренилась в природе человека и закрепилась эволюционно. Каждое мгновение на людей действуют десятки раздражителей, и было бы крайне неэффективно уделять внимание каждому из них.
В интернет-среде наш опыт научил нас тому, что баннеры, меню навигации, поиск и другие часто используемые элементы размещаются в верхней части страницы. В результате мы, как правило, игнорируем баннеры и все, что похоже на рекламу, за исключением тех случаев, когда мы целенаправленно ищем такие предложения, и фокусируемся на той области, где, как мы ожидаем, есть тот контент, который нам нужен.
Что нужно делать?
Эти три паттерна человеческого поведения могут вам изрядно насолить, но, как было сказано выше, в низкой конверсии глупо обвинять своих посетителей, ведь это не решит проблемы. Ниже — советы, которые помогут избежать этих ловушек:
- добейтесь того, чтобы работа с вашим ресурсом была простой и удобной на всех устройствах. Изучите аудиторию, определите, с каких устройств они заходят на ваш сайт, и оптимизируйтесь под них;
- не думайте, что пользователи будут активно переключаться с телефона на планшет или компьютер для выполнения конкретных задач;
- сделайте возможным пользователям легко синхронизировать информацию между различными платформами; работу, начатую на телефоне, они легко смогут продолжить на компьютере, не выполняя при этом никаких подготовительных действий;
- определите, как люди предпочитают действовать на вашем сайте в той или иной ситуации. Если зачастую они выбирают далеко не самый эффективный вариант, сделайте альтернативный способ более наглядным, заметным и полезным;
- ключевые элементы дизайна не должны напоминать рекламные баннеры. «Баннерная слепота» — это не выдумка, а реальное следствие избирательного внимания людей.
Заключение
Вместо того, чтобы навешивать на своих клиентов ярлыки (глупый, невнимательный, ленивый и т. д.), постарайтесь приспособиться к их особенностям и разработать более эффективные дизайнерские решения.
Эволюция человека заняла миллионы лет, и что-то поменять мы просто не в силах. В зоне нашей ответственности — только собственные лендинги и продукты, дизайн которых достаточно легко адаптировать под эти привычки, если, конечно, у вас получится избавиться от них самим.
Высоких вам конверсий!
По материалам: nngroup.comImage source: Gianluca Scarpa
24-11-2015
«Кризис и пандемия заставят покупателей изменить паттерны поведения, а издателей — каналы дистрибуции»
«Росмэн» входит в десятку крупнейших российских издательств, проводит ежегодный конкурс «Новая детская книга», не боится печатать молодых авторов и выпускает замечательные детские книги. Издательство входит в группу компаний, которая занимается детскими книгами, игрушками, товарами для творчества и лицензированием. Что происходит на рынке детской литературы сейчас? Падают ли продажи книг для детей в условиях кризиса? Как игрушечный бизнес помогает развиваться книжному? Об этом и многом другом «Инвест-Форсайту» рассказал гендиректор издательства «Росмэн», кандидат исторических наук, многодетный отец Борис Кузнецов.— Борис, группа компаний «Росмэн» в цифрах — это…
— 480 профессионалов в разных областях — редакторы, менеджеры, переводчики, дизайнеры; 14 миллионов детских книг, изданных только за прошлый год; 2500 наименований книг в постоянном доступе; перевод наших книг на 18 языков мира. Рекордным тиражом в 2 миллиона 100 тысяч экземпляров была продана седьмая книга о Гарри Поттере.
— Ничего себе! Но сейчас экономисты обещают кризис и падение продаж во всех отраслях. Можно ли надеяться, что детские книги при этом не пострадают?
— Условная независимость российского книжного рынка от курсовых колебаний — это иллюзия. К примеру, вся мелованная бумага покупается за евро, у нас в стране почему-то забыли, как ее производить. Цены на материалы растут, а покупательская способность падает… Но кризис и падение рубля в 2008 году, по моему мнению, только улучшили ситуацию на книжном рынке. За последующие годы осыпалась литература жанровая, легкое чтение, которое конкурировало с дешевыми сериалами и конкуренции не выдержало. А серьезная литература развилась и окрепла. Надеюсь, в случае очередного кризиса спрос на хорошие детские книжки не упадет. Бояться надо тем, кто производит некачественную продукцию. Потому что сегодня книга стала очевидным интеллектуальным хобби, за которое люди готовы платить. Но и требования к текстам, иллюстрациям очень выросли.
— Уже десять лет «Росмэн» занимается не только изданием книг, но и производством игрушек. Эти два вида деятельности развиваются параллельно или проекты пересекаются?
— Группа компаний, специализирующаяся на самой разной продукции для детей, — это очень удачная диверсификация бизнеса, она дает много уникальных возможностей. Так, например, компания «Росмэн» вывела на российский рынок известный мультимедийный проект «Свинка Пеппа». Будучи комплексным поставщиком в рамках успешного бренда, мы развернули и поставили в магазины большую линейку игрушек, игр, канцелярских товаров. Издательство, естественно, встроилось со своей продукцией.
Игрушки как производная от книжек — процесс более сложный, в России не практикующийся. За рубежом есть такие примеры, показательный — Груффало. Из книги детской английской писательницы Джулии Дональдсон этот персонаж перекочевал на полки магазинов игрушек, стал большим игрушечным брендом. На российском рынке таких успешных коммерческих проектов пока нет. Но все меняется — паттерны восприятия, каналы дистрибуции.
— Новые каналы дистрибуции — это онлайн-продажи? Будут ли они расти в сегменте детских книг?
— В ситуации ограниченных ресурсов и физической изоляции люди будут вырабатывать для себя новые паттерны — приобретение товаров в первую очередь в интернете. Мы сейчас очень серьезно перестраиваем трейд-маркетинговую работу с учетом интернет-активности. Потребители склонны формировать привычки, поведенческие паттерны. Скорее всего, после того как минует эпидемия коронавируса, у людей сформируется глубокая устойчивая привычка покупок в интернете. Мы видим, что онлайн-продажи растут на многие группы товаров. Для издателей тут тоже открываются очень интересные возможности.
Практика показывает, что покупатели онлайн-магазинов делают более осознанный и глубокий читательский выбор. На интернет-площадках можно продавать более сложные книги с опережающим контентом. Примерно 60–70% розничных книжных магазинов предпочитают работать с привычным ассортиментом. И это, как правило, не консерватизм закупщиков и товароведов: это особенности реального выбора потребителя в книжных магазинах малых и средних форматов. А онлайн-магазины со своей «резиновой полкой» не боятся экспериментов.
Если же говорить о реальных цифрах и статистике, то доля детских книг, приобретаемых онлайн, нисколько не меньше аналогичной доли во «взрослой книге». Сейчас мы покупаем в интернет-магазинах не меньше трети книг. И дальше эта доля будет только увеличиваться.
— А что интересного сегодня происходит в детской литературе, каковы основные тренды, какие книжки хорошо продаются?
— Хороший устойчивый тренд — комиксы и графические романы. Это сложный синтетический жанр, очень непростой для восприятия. Издавать качественные комиксы очень дорого и сложно. Для многих взрослых это неочевидно, им удобнее считать комиксы какими-то дешевыми недокнигами, чем признаться в том, что они просто не понимают жанра. Зато комиксы прекрасно воспринимают и покупают подростки.
Интересное направление — нон-фикшн комиксы. За рубежом этот жанр существует уже давно, у нас становится понятным и востребованным только сейчас. Детская литература нон-фикшн вообще неплохо продается, ее долю в общем объеме книг увеличивают многие издатели. Речь, конечно, идет не о классических детских энциклопедиях, где в алфавитном порядке теснятся сведения обо всем на свете. Школьники уже давно не пишут доклады и рефераты, обложившись книгами. Зато активно развивается авторский иллюстрированный нон-фикшн для детей младшего возраста.
В советское время были замечательные популяризаторы науки: Перельман, Ферсман, Левитан. Они умели интересно и просто рассказывать о сложных вещах. В постсоветское время традиция прервалась, а года три-четыре назад начала возвращаться. Здесь ничего удивительного нет. Во всем мире сейчас происходит движение в сторону нон-фикшн, причем и во взрослой, и в детской литературе. Россия — страна литературоцентричная, у нас на полках всегда был большой перекос в сторону фикшн, сейчас этот перекос начал немного сглаживаться. И мне это нравится.
Еще один важный тренд: книги для развития эмоционального интеллекта и социальных компетенций. Он добрался до России с некоторым опозданием — за рубежом такие книжки продаются уже довольно давно и очень успешно. Нам такие книги нужны не меньше. В нашей культуре вообще как-то не принято работать с эмоциями, глубоко осознавать их. Литература, о которой мы сейчас говорим, учит детей обращать внимание на все разнообразие эмоционального спектра, правильно действовать в самых разнообразных ситуациях.
— По данным группы компаний «ЛитРес», в России особенно быстро увеличивается доля электронных и аудиокниг: по сравнению с прошлым годом рынок вырос на 35%. А электронные детские и подростковые книги пользуются спросом?
— Продажи электронных книг растут во всем мире. На американском рынке доля электронных книг составляет 23%. Но при этом продажи качественных детских печатных книг не падают. По статистике, например, «Читай-города» видно, что детская книга чувствует себя неплохо, дает стабильный прирост год от года.
В принципе детские и подростковые электронные книги продаются значительно хуже взрослых. Подростки читают в интернете, но не склонны за это платить. А маленьким детям читают родители, которые чаще выбирают все-таки бумажные версии (и это правильно, чтение с айпада — провоцирующая ситуация, ребенок знает, что благодаря этому устройству можно заняться и более интересными вещами, такими как игры и просмотр мультиков).
Но вот мы издали «Болотницу» победительницы «Новой детской книги» Татьяны Мастрюковой, и неожиданно эта книга показала очень неплохие продажи электронной версии. С ней мы впервые ощутили, что от продажи электронных версий книг можно получать доходы.
— Как стать автором «Росмэн»?
— Новых авторов мы ищем только через конкурс «Новая детская книга». Собственно говоря, для того и он и был придуман. Присылать письма на адрес редакции — занятие неблагодарное. Потому что на почту любого крупного издательства ежедневно приходит по 20–25 писем с предложениями от авторов. Никаких редакторских сил не хватит на то, чтобы все их разобрать и прочитать. «Новая детская книга» выполняет роль фильтра. У нас есть определенные требования к текстам, сформулированы номинации. Практически все книги, вошедшие в шорт-листы, издаются. Если не у нас, то в других издательствах. Потому что за конкурсом, который проводится с 2009 года, пристально следят и журналисты, и коллеги-издатели.
— Случается, что хороших авторов переманивают?
— За хорошими художниками и авторами охотятся, их переманивают и перекупают. Но конкуренция в нашем бизнесе — это нормально, она больше напоминает увлекательную игру, чем кровавую битву без правил. Есть много прекрасных детских издательств. «Эксмо», «АСТ», «Азбука-Аттикус» занимаются мощными детскими проектами. Отличные книги есть у Clever, «Самоката», «КомпасГида», «Пешком в историю». Конечно, мы интересуемся тем, что делается в других издательствах, какие книги и как продаются, стремимся стать лучше других. Такая конкуренция бизнесу только на пользу. Гораздо хуже, когда на наш рынок приходят «туристы» — компании, которые, к примеру, занимаются типографскими услугами или игрушками, но в придачу к основному бизнесу вдруг решают что-то издавать. Они присматриваются к рынку, делают клон популярной книги или серии книг, начинают продавать похожую продукцию, снизив цены. Это вредное и лишнее для рынка явление. Я за конечную бизнес-справедливость — если ты приходишь на какой-то рынок, то с собой ты должен принести новые идеи и возможности. В противном случае ты просто пришел попаразитировать, рано или поздно такая стратегия исчерпается, и рынок тебя отторгнет. Но до этого момента ты успеешь подпортить жизнь индустрии в целом.
Источник
О компании «Росмэн»
Следите за новостями. Подписывайтесь на email-рассылку на еженедельный «Вестник индустрии детских товаров» и получайте самое важное о бизнесе в удобном формате! Делитесь своими новостями, высказывайте свое мнение и размещайте рекламу на наших ресурсах.
Паттерн | Отношения | Наша Психология
Слово произошло от лат. patronus, дословно переводится как «модель», «образец для подражания», «шаблон». Однако смысл его всегда более узкий и зависит от того, в каком контексте он употребляется.
Например, в психологических текстах это слово чаще всего используется в следующих контекстах:
• паттерны поведения
(набор стереотипных реакций или последовательность действий)
У каждого из нас есть типичные способы взаимодействия с окружающим миром – устойчивые модели поведения, которые человек предпочитает использовать при общении с другими людьми. Кто-то чаще выбирает паттерны уверенного поведения, кто-то – саморазрушающие или манипулятивные паттерны. Поэтому, чтобы с высокой точностью предсказать, как поведет себя человек в той или иной ситуации, бывает достаточно определить основные паттерны поведения, которых он придерживается в своей жизни в целом и в подобных ситуациях в частности. А для этого необходимо лишь проанализировать, как повел себя человек в подобных ситуациях в прошлом и почему он именно такое поведение считает наилучшим из всех возможных. Например, вы хотите подарить приятелю творческий подарок на День рождения (планшет для рисования на компьютере, участие в творческой группе и др.). Проанализировав модели его поведения в прошлом, вы можете прийти к выводу, что этот человек обычно поступает весьма консервативно и не любит изменений в своей жизни (для него типичны консервативные паттерны поведения). А это означает, что такой подарок вряд ли ему понравится, лучше поискать что-нибудь другое.
Когда мудрая женщина выбирает партнера для брака, она нередко обращает внимание на то, как он относится к своей матери. Почему это важно? Да потому, что чаще всего по отношению матери у мужчины проявляются те же паттерны, что проявятся по отношению к жене через много лет, когда спадет пелена романтизма и он перестанет восхищаться своей супругой, как раньше. Уважает ли мужчина свою мать? Помогает ли ей? Поддерживает ли в трудные моменты? Вот они, паттерны, которые так важно учесть женщине, когда она принимает решение о вступлении в брак. Конечно, бывают и исключения из правил. Например, у мужчины могли не сложиться отношения с матерью по вполне конкретным причинам, которые не определят в дальнейшем его отношения к жене. Но какова вероятность того, что это так, если уже сейчас мы видим неутешительный пример? Кстати, не помешает проверить свою гипотезу, обратив внимание на то, как человек ведет себя по отношению к другим близким ему людям.
• гипнотические паттерны
(текст, который использует гипнолог для наведения транса и последующей работы в трансе)
Проще говоря, это особые речевые приемы, которые позволяют ввести человека в транс, оказать на него влияние через его бессознательное. Некоторые гипнологи могут оказывать подобное влияние без введения в глубокий транс, когда человек искренне считает, что находится в сознании, но его выбор в определенной мере заведомо определен используемым гипнотическим паттерном. Кстати, эти паттерны используют не только гипнологи, но также манипуляторы, пикаперы, педагоги. Например, любимый многими родителями паттерн «выбор без выбора», когда не желающего делать уроки ребенка спрашивают: «Ты когда пойдешь делать уроки – через 5 или через 10 минут?». У ребенка не возникает сопротивления, потому что в его сознании – иллюзия выбора, ему кажется, что выбирает он.
Автор статьи: Мария МИНАКОВА
Наблюдатель
Также известен как: подписчик на событие, слушатель
Намерение
Observer — это шаблон проектирования поведения, который позволяет определить механизм подписки для уведомления нескольких объектов о любых событиях, которые происходят с объектом, который они наблюдают.
Проблема Представьте, что у вас есть два типа объектов: Customer
и Store
. Покупатель очень заинтересован в продукте определенной марки (скажем, это новая модель iPhone), который очень скоро должен появиться в магазине.
Покупатель мог заходить в магазин каждый день и проверять наличие товара. Но пока продукт все еще находится в пути, большинство этих поездок будет бессмысленным.
Посещение магазина и рассылка спама
С другой стороны, магазин может рассылать тонны электронных писем (которые можно рассматривать как спам) всем покупателям каждый раз, когда появляется новый продукт. Это избавило бы некоторых покупателей от бесконечных походов в магазин. В то же время это расстроило других клиентов, не заинтересованных в новых продуктах.
Похоже, у нас конфликт. Либо покупатель тратит время на проверку наличия товара, либо магазин тратит ресурсы, уведомляя не тех покупателей.
РешениеОбъект, который имеет какое-то интересное состояние, часто называется субъектом , но поскольку он также будет уведомлять другие объекты об изменениях своего состояния, мы будем называть его издателем . Все остальные объекты, которые хотят отслеживать изменения в состоянии издателя, называются подписчиками .
Шаблон Observer предполагает, что вы добавляете механизм подписки к классу издателя, чтобы отдельные объекты могли подписаться на поток событий, исходящий от этого издателя, или отказаться от подписки на него. Не бойся! Все не так сложно, как кажется. На самом деле этот механизм состоит из 1) поля массива для хранения списка ссылок на объекты-подписчики и 2) нескольких общедоступных методов, которые позволяют добавлять подписчиков и удалять их из этого списка.
Механизм подписки позволяет отдельным объектам подписываться на уведомления о событиях.
Теперь, когда с издателем происходит важное событие, он перебирает подписчиков и вызывает специальный метод уведомления для их объектов.
Реальные приложения могут иметь десятки разных классов подписчиков, которые заинтересованы в отслеживании событий одного и того же класса издателя. Вы бы не хотели связывать издателя со всеми этими классами. Кроме того, вы можете даже не знать о некоторых из них заранее, если предполагается, что ваш класс издателя будет использоваться другими людьми.
Вот почему так важно, чтобы все подписчики реализовали один и тот же интерфейс и чтобы издатель общался с ними только через этот интерфейс.Этот интерфейс должен объявлять метод уведомления вместе с набором параметров, которые издатель может использовать для передачи некоторых контекстных данных вместе с уведомлением.
Publisher уведомляет подписчиков, вызывая определенный метод уведомления для их объектов.
Если ваше приложение имеет несколько разных типов издателей и вы хотите, чтобы ваши подписчики были совместимы со всеми из них, вы можете пойти еще дальше и заставить всех издателей использовать один и тот же интерфейс. Этот интерфейс должен описывать только несколько методов подписки.Интерфейс позволит подписчикам наблюдать за состояниями издателей без привязки к их конкретным классам.
Аналогия из реального мираПодписка на журналы и газеты.
Если вы подписаны на газету или журнал, вам больше не нужно идти в магазин, чтобы проверить, доступен ли следующий номер. Вместо этого издатель отправляет новые выпуски прямо в ваш почтовый ящик сразу после публикации или даже заранее.
Издатель ведет список подписчиков и знает, какие журналы им интересны.Подписчики могут покинуть список в любое время, когда они захотят запретить издателю присылать им новые выпуски журнала.
СтруктураPublisher выдает интересующие события другим объектам. Эти события происходят, когда издатель меняет свое состояние или выполняет какое-либо поведение. Издатели содержат инфраструктуру подписки, которая позволяет новым подписчикам присоединяться, а текущим подписчикам покидать список.
Когда происходит новое событие, издатель просматривает список подписки и вызывает метод уведомления, объявленный в интерфейсе подписчика для каждого объекта подписчика.
Интерфейс подписчика объявляет интерфейс уведомления. В большинстве случаев он состоит из одного метода обновления
Конкретные подписчики выполняют некоторые действия в ответ на уведомления, выпущенные издателем. Все эти классы должны реализовывать один и тот же интерфейс, чтобы издатель не был привязан к конкретным классам.
Обычно подписчикам требуется некоторая контекстная информация для правильной обработки обновления. По этой причине издатели часто передают некоторые контекстные данные в качестве аргументов метода уведомления. Издатель может передать себя в качестве аргумента, позволяя подписчику напрямую получать любые требуемые данные.
Клиент создает объекты издателя и подписчика отдельно, а затем регистрирует подписчиков для обновлений издателя.
В этом примере шаблон Observer позволяет объекту текстового редактора уведомлять другие служебные объекты об изменениях своего состояния.
Уведомление объектов о событиях, происходящих с другими объектами.
Список подписчиков составляется динамически: объекты могут запускать или останавливать прослушивание уведомлений во время выполнения, в зависимости от желаемого поведения вашего приложения.
В этой реализации класс редактора не поддерживает список подписок сам по себе. Он делегирует эту работу специальному вспомогательному объекту, предназначенному именно для этого. Вы можете обновить этот объект, чтобы он служил централизованным диспетчером событий, позволяя любому объекту действовать как издатель.
Для добавления новых подписчиков в программу не требуется вносить изменения в существующие классы издателей, если они работают со всеми подписчиками через один и тот же интерфейс.
// Базовый класс издателя включает управление подпиской
// код и методы уведомления.
класс EventManager - это
слушатели частных полей: хэш-карта типов событий и слушателей
метод subscribe (eventType, listener) - это
listeners.add (тип события, слушатель)
метод отказа от подписки (тип события, слушатель)
слушатели.удалить (тип события, слушатель)
метод notify (тип события, данные)
foreach (слушатель в listeners.of (eventType)) делать
listener.update (данные)
// Конкретный издатель содержит реальную бизнес-логику,
// интересно некоторым подписчикам. Мы могли бы получить этот класс
// от базового издателя, но это не всегда возможно в
// реальная жизнь, потому что конкретный издатель уже может быть
// подкласс. В этом случае вы можете пропатчить логику подписки
// в композиции, как здесь.редактор классов
события публичного поля: EventManager
частный файл поля: File
конструктор Editor ()
events = новый EventManager ()
// Методы бизнес-логики могут уведомлять подписчиков о
// изменения.
метод openFile (путь)
this.file = новый файл (путь)
events.notify ("открыть", имя_файла)
метод saveFile () - это
file.write ()
events.notify ("сохранить", имя_файла)
// ...
// Вот интерфейс подписчика. Если ваш язык программирования
// поддерживает функциональные типы, можно заменить весь
// иерархия подписчиков с набором функций.интерфейс EventListener
обновление метода (имя файла)
// Конкретные подписчики реагируют на обновления, выпущенные издателем
// они прикреплены к.
класс LoggingListener реализует EventListener - это
журнал частного поля: Файл
личное поле сообщение: строка
конструктор LoggingListener (имя_файла_журнала, сообщение)
this.log = новый файл (имя_файла)
this.message = сообщение
обновление метода (имя файла)
log.write (replace ('% s', имя файла, сообщение))
класс EmailAlertsListener реализует EventListener - это
электронная почта частного поля: строка
личное поле сообщение: строка
конструктор EmailAlertsListener (электронная почта, сообщение) - это
это.email = электронная почта
this.message = сообщение
обновление метода (имя файла)
system.email (электронная почта, заменить ('% s', имя файла, сообщение))
// Приложение может настраивать издателей и подписчиков на
// время выполнения.
класс Application - это
метод config () - это
редактор = новый редактор ()
logger = новый LoggingListener (
"/path/to/log.txt",
«Кто-то открыл файл:% s»)
editor.events.subscribe ("открыть", регистратор)
emailAlerts = новый EmailAlertsListener (
"admin @ example.com ",
"Кто-то изменил файл:% s")
editor.events.subscribe ("сохранить", emailAlerts)
ПрименяемостьИспользуйте шаблон «Наблюдатель», когда изменения состояния одного объекта могут потребовать изменения других объектов, а фактический набор объектов заранее неизвестен или изменяется динамически.
Вы часто можете столкнуться с этой проблемой при работе с классами графического пользовательского интерфейса. Например, вы создали настраиваемые классы кнопок и хотите, чтобы клиенты подключали некоторый настраиваемый код к вашим кнопкам, чтобы он запускался всякий раз, когда пользователь нажимает кнопку.
Шаблон Observer позволяет любому объекту, реализующему интерфейс подписчика, подписаться на уведомления о событиях в объектах издателя. Вы можете добавить механизм подписки к своим кнопкам, позволяя клиентам подключать свой собственный код через настраиваемые классы подписчиков.
Используйте шаблон, когда одни объекты в вашем приложении должны наблюдать за другими, но только в течение ограниченного времени или в определенных случаях.
Список подписок является динамическим, поэтому подписчики могут присоединиться к списку или выйти из него в любое время.
Как реализоватьПросмотрите свою бизнес-логику и попытайтесь разбить ее на две части: основная функциональность, независимая от другого кода, будет действовать как издатель; остальное превратится в набор классов подписчиков.
Объявить абонентский интерфейс. Как минимум, он должен объявить один метод
update
.Объявите интерфейс издателя и опишите пару методов для добавления объекта подписчика и удаления его из списка.Помните, что вебмастеры должны работать с подписчиками только через интерфейс подписчика.
Решите, где разместить фактический список подписки и реализацию методов подписки. Обычно этот код выглядит одинаково для всех типов издателей, поэтому очевидное место для его размещения — абстрактный класс, производный непосредственно из интерфейса издателя. Конкретные издатели расширяют этот класс, наследуя поведение подписки.
Однако, если вы применяете шаблон к существующей иерархии классов, рассмотрите подход, основанный на композиции: поместите логику подписки в отдельный объект и заставьте всех реальных издателей использовать ее.
Создайте конкретные классы издателя. Каждый раз, когда внутри издателя происходит что-то важное, он должен уведомить всех своих подписчиков.
Реализуйте методы уведомления об обновлениях в конкретных классах подписчиков. Большинству подписчиков потребуются некоторые контекстные данные о событии. Его можно передать как аргумент метода уведомления.
Но есть и другой вариант. Получив уведомление, подписчик может получить любые данные прямо из уведомления.В этом случае издатель должен пройти через метод обновления. Менее гибкий вариант — навсегда связать издателя с подписчиком через конструктор.
Клиент должен создать всех необходимых подписчиков и зарегистрировать их у соответствующих издателей.
- Принцип открытого / закрытого . Вы можете вводить новые классы подписчиков, не меняя код издателя (и наоборот, если есть интерфейс издателя).
- Вы можете устанавливать отношения между объектами во время выполнения.
- Подписчики получают уведомления в случайном порядке.
Цепочка ответственности, команда, посредник и наблюдатель рассматривают различные способы соединения отправителей и получателей запросов:
- Цепочка ответственности последовательно передает запрос по динамической цепочке потенциальных получателей, пока один из них не обработает его.
- Команда устанавливает однонаправленные соединения между отправителями и получателями.
- Посредник устраняет прямые соединения между отправителями и получателями, заставляя их связываться косвенно через объект-посредник.
- Observer позволяет получателям динамически подписываться и отказываться от получения запросов.
Разница между Посредником и Наблюдателем часто неуловима. В большинстве случаев вы можете реализовать любой из этих шаблонов; но иногда можно применять и то, и другое одновременно.Посмотрим, как мы можем это сделать.
Основная цель Mediator — устранить взаимные зависимости между набором компонентов системы. Вместо этого эти компоненты становятся зависимыми от одного объекта-посредника. Цель Observer — установить динамические односторонние связи между объектами, где одни объекты действуют как подчиненные другим.
Существует популярная реализация паттерна Mediator , основанная на Observer . Объект-посредник играет роль издателя, а компоненты действуют как подписчики, которые подписываются на события посредника и отписываются от них.Когда Mediator реализован таким образом, он может быть очень похож на Observer .
Если вы запутались, помните, что вы можете реализовать шаблон Посредника и другими способами. Например, вы можете навсегда связать все компоненты с одним и тем же объектом-посредником. Эта реализация не будет напоминать Observer , но по-прежнему будет экземпляром шаблона Mediator.
Теперь представьте программу, в которой все компоненты стали издателями, позволяющими динамические связи друг с другом.Не будет централизованного объекта-посредника, только распределенный набор наблюдателей.
Команда
Также известен как: Действие, Транзакция
Намерение
Команда — это шаблон проектирования поведения, который превращает запрос в автономный объект, содержащий всю информацию о запросе. Это преобразование позволяет передавать запросы в качестве аргументов метода, задерживать выполнение запроса или ставить его в очередь, а также поддерживать отменяемые операции.
Проблема Представьте, что вы работаете над новым приложением для текстового редактора. Ваша текущая задача — создать панель инструментов с набором кнопок для различных операций редактора. Вы создали очень удобный класс Button
, который можно использовать для кнопок на панели инструментов, а также для общих кнопок в различных диалогах.
Все кнопки приложения являются производными от одного класса.
Хотя все эти кнопки выглядят одинаково, все они должны выполнять разные функции.Где бы вы поместили код для различных обработчиков нажатия этих кнопок? Самое простое решение — создать множество подклассов для каждого места, где используется кнопка. Эти подклассы будут содержать код, который должен быть выполнен при нажатии кнопки.
Множество подклассов кнопок. Что может пойти не так?
Вскоре вы понимаете, что этот подход глубоко ошибочен. Во-первых, у вас есть огромное количество подклассов, и это было бы нормально, если бы вы не рисковали нарушить код в этих подклассах каждый раз, когда вы изменяете базовый класс Button
.Проще говоря, ваш код графического интерфейса стал неудобно зависеть от изменчивого кода бизнес-логики.
Несколько классов реализуют одну и ту же функциональность.
И вот самая уродливая часть. Некоторые операции, такие как копирование / вставка текста, нужно будет вызывать из нескольких мест. Например, пользователь может щелкнуть небольшую кнопку «Копировать» на панели инструментов, скопировать что-либо через контекстное меню или просто нажать Ctrl + C
на клавиатуре.
Изначально, когда в нашем приложении была только панель инструментов, можно было разместить реализацию различных операций в подклассах кнопок.Другими словами, наличие кода для копирования текста внутри подкласса CopyButton
было нормальным. Но затем, когда вы реализуете контекстные меню, ярлыки и другие вещи, вам придется либо дублировать код операции во многих классах, либо сделать меню зависимыми от кнопок, что является еще худшим вариантом.
Хороший дизайн программного обеспечения часто основан на принципе разделения задач , что обычно приводит к разбиению приложения на слои.Самый распространенный пример: уровень графического пользовательского интерфейса и еще один уровень бизнес-логики. Слой GUI отвечает за визуализацию красивой картинки на экране, захват любого ввода и отображение результатов того, что делают пользователь и приложение. Однако, когда дело доходит до выполнения чего-то важного, например, расчета траектории луны или составления годового отчета, уровень графического интерфейса пользователя делегирует работу нижележащему уровню бизнес-логики.
В коде это может выглядеть так: объект GUI вызывает метод объекта бизнес-логики, передавая ему некоторые аргументы.Этот процесс обычно описывается как один объект, отправляющий другому запрос .
Объекты GUI могут напрямую обращаться к объектам бизнес-логики.
Шаблон Command предполагает, что объекты графического интерфейса не должны отправлять эти запросы напрямую. Вместо этого вы должны извлечь все детали запроса, такие как вызываемый объект, имя метода и список аргументов, в отдельный класс command с одним методом, который запускает этот запрос.
Командные объекты служат связями между различными объектами графического интерфейса и бизнес-логики.Отныне объекту GUI не нужно знать, какой объект бизнес-логики получит запрос и как он будет обрабатываться. Объект GUI просто запускает команду, которая обрабатывает все детали.
Доступ к уровню бизнес-логики с помощью команды.
Следующий шаг — заставить ваши команды реализовывать тот же интерфейс. Обычно у него есть только один метод выполнения, который не принимает параметров. Этот интерфейс позволяет использовать различные команды с одним и тем же отправителем запроса, не связывая его с конкретными классами команд.В качестве бонуса теперь вы можете переключать объекты команд, связанные с отправителем, эффективно изменяя поведение отправителя во время выполнения.
Вы могли заметить один недостающий элемент головоломки, а именно параметры запроса. Объект GUI мог предоставить объекту бизнес-уровня некоторые параметры. Поскольку метод выполнения команды не имеет параметров, как нам передать детали запроса получателю? Оказывается, команда должна быть либо предварительно сконфигурирована с этими данными, либо иметь возможность получать их самостоятельно.
Объекты графического интерфейса делегируют работу командам.
Вернемся к нашему текстовому редактору. После применения шаблона Command нам больше не нужны все эти подклассы кнопок для реализации различного поведения при нажатии. Достаточно поместить одно поле в базовый класс Button
, в котором хранится ссылка на объект команды, и заставить кнопку выполнять эту команду одним щелчком мыши.
Вы реализуете набор командных классов для каждой возможной операции и свяжете их с определенными кнопками, в зависимости от предполагаемого поведения кнопок.
Другие элементы графического интерфейса пользователя, такие как меню, ярлыки или целые диалоговые окна, могут быть реализованы таким же образом. Они будут связаны с командой, которая запускается, когда пользователь взаимодействует с элементом графического интерфейса. Как вы уже, наверное, догадались, элементы, относящиеся к одним и тем же операциям, будут связаны с одними и теми же командами, предотвращая любое дублирование кода.
В результате команды становятся удобным промежуточным уровнем, который уменьшает взаимосвязь между уровнями графического интерфейса и бизнес-логики. И это лишь малая часть преимуществ, которые может предложить шаблон Command!
Аналогия из реального мираДелаем заказ в ресторане.
После долгой прогулки по городу вы попадаете в симпатичный ресторан и садитесь за столик у окна. К вам подходит приветливый официант и быстро принимает ваш заказ, записывая его на листе бумаги. Официант идет на кухню и вешает заказ на стену. Через некоторое время заказ доходит до шеф-повара, который его читает и соответствующим образом готовит блюдо. Повар размещает блюдо на подносе вместе с заказом. Официант обнаруживает поднос, проверяет заказ, чтобы убедиться, что все в порядке, и приносит все к вашему столу.
Заказ бумаги служит командой. Он остается в очереди, пока шеф-повар не приготовит его подать. В заказе содержится вся необходимая информация, необходимая для приготовления блюда. Это позволяет шеф-повару сразу приступить к приготовлению, вместо того, чтобы бегать и уточнять детали заказа напрямую у вас.
СтруктураКласс Sender (он же вызывающий ) отвечает за инициирование запросов. Этот класс должен иметь поле для хранения ссылки на командный объект.Отправитель запускает эту команду вместо отправки запроса непосредственно получателю. Обратите внимание, что отправитель не несет ответственности за создание объекта команды. Обычно он получает заранее созданную команду от клиента через конструктор.
Интерфейс Command обычно объявляет только один метод выполнения команды.
Конкретные команды реализуют различные типы запросов. Конкретная команда не должна выполнять работу сама по себе, а скорее должна передавать вызов одному из объектов бизнес-логики.Однако для упрощения кода эти классы можно объединить.
Параметры, необходимые для выполнения метода на принимающем объекте, могут быть объявлены как поля в конкретной команде. Вы можете сделать объекты команд неизменяемыми, разрешив только инициализацию этих полей через конструктор.
Класс Receiver содержит некоторую бизнес-логику. Практически любой объект может выступать в качестве приемника. Большинство команд обрабатывают только детали того, как запрос передается получателю, в то время как сам получатель выполняет фактическую работу.
Клиент создает и настраивает конкретные объекты команд. Клиент должен передать все параметры запроса, включая экземпляр получателя, в конструктор команды. После этого результирующая команда может быть связана с одним или несколькими отправителями.
В этом примере шаблон Command помогает отслеживать историю выполненных операций и позволяет при необходимости отменить операцию.
Операции, которые нельзя отменить в текстовом редакторе.
Команды, которые приводят к изменению состояния редактора (например, вырезание и вставка), создают резервную копию состояния редактора перед выполнением операции, связанной с командой. После выполнения команда помещается в историю команд (стек командных объектов) вместе с резервной копией состояния редактора на тот момент. Позже, если пользователю потребуется отменить операцию, приложение может взять самую последнюю команду из истории, прочитать связанную резервную копию состояния редактора и восстановить ее.
Клиентский код (элементы графического интерфейса, история команд и т. Д.) Не связан с конкретными классами команд, поскольку он работает с командами через командный интерфейс. Такой подход позволяет вводить новые команды в приложение, не нарушая существующий код.
// Базовый класс команд определяет общий интерфейс для всех
// конкретные команды.
абстрактный класс Команда
приложение защищенного поля: Приложение
редактор защищенного поля: Editor
резервное копирование защищенного поля: текст
Команда конструктора (приложение: Приложение, редактор: Редактор)
это.app = app
this.editor = редактор
// Делаем резервную копию состояния редактора.
метод saveBackup () - это
backup = editor.text
// Восстанавливаем состояние редактора.
метод undo () - это
editor.text = резервная копия
// Метод выполнения объявляется абстрактным, чтобы заставить все
// конкретные команды для обеспечения их собственных реализаций.
// Метод должен возвращать истину или ложь в зависимости от того,
// команда меняет состояние редактора.
абстрактный метод execute ()
// Здесь идут конкретные команды.class CopyCommand extends Command is
// Команда копирования не сохраняется в истории, т.к.
// не меняет состояние редактора.
метод execute () является
app.clipboard = editor.getSelection ()
вернуть ложь
class CutCommand extends Command is
// Команда вырезания меняет состояние редактора, поэтому
// его необходимо сохранить в истории. И он будет сохранен как
// пока метод возвращает истину.
метод execute () является
saveBackup ()
app.clipboard = редактор.getSelection ()
editor.deleteSelection ()
вернуть истину
class PasteCommand extends Command is
метод execute () является
saveBackup ()
editor.replaceSelection (app.clipboard)
вернуть истину
// Операция отмены также является командой.
class UndoCommand extends Command is
метод execute () является
app.undo ()
вернуть ложь
// Глобальная история команд - это просто стек.
класс CommandHistory - это
история частных полей: массив Command
// Последний через ...
метод push (c: Command) - это
// Вставляем команду в конец массива истории.// ... первым вышел
метод pop (): Команда
// Получить самую последнюю команду из истории.
// Класс редактора выполняет фактические операции редактирования текста. Играет
// роль получателя: все команды в конечном итоге делегируют
// выполнение методов редактора.
редактор классов
текст поля: строка
метод getSelection () - это
// Возвращаем выделенный текст.
метод deleteSelection () - это
// Удаляем выделенный текст.
метод replaceSelection (текст) является
// Вставляем содержимое буфера обмена в текущий
// позиция.// Класс приложения устанавливает отношения между объектами. Он действует как
// отправитель: когда что-то нужно сделать, он создает команду
// объект и выполняет его.
класс Application - это
буфер обмена поля: строка
полевые редакторы: массив редакторов
поле activeEditor: Редактор
история поля: CommandHistory
// Код, назначающий команды объектам пользовательского интерфейса, может выглядеть
// нравится.
метод createUI ()
// ...
copy = function () {executeCommand (
new CopyCommand (this, activeEditor))}
copyButton.setCommand (копия)
shortcuts.onKeyPress ("Ctrl + C", копировать)
cut = function () {executeCommand (
new CutCommand (this, activeEditor))}
cutButton.setCommand (вырезать)
shortcuts.onKeyPress ("Ctrl + X", вырезать)
paste = function () {executeCommand (
new PasteCommand (this, activeEditor))}
pasteButton.setCommand (вставить)
shortcuts.onKeyPress ("Ctrl + V", вставить)
отменить = функция () {выполнитьКоманду (
new UndoCommand (this, activeEditor))}
undoButton.setCommand (отменить)
shortcuts.onKeyPress ("Ctrl + Z", отменить)
// Выполняем команду и проверяем, нужно ли ее добавлять в
// история.
метод executeCommand (command) - это
если (command.execute)
history.push (команда)
// Берем самую последнюю команду из истории и запускаем ее
// метод отмены. Обратите внимание, что мы не знаем класс этого
// команда. Но мы не обязаны, так как команда знает
// как отменить собственное действие.
метод undo () - это
команда = история.поп ()
если (команда! = ноль)
command.undo ()
ПрименяемостьИспользуйте шаблон «Команда», если вы хотите параметризовать объекты с помощью операций.
Шаблон Command может превратить вызов определенного метода в автономный объект. Это изменение открывает множество интересных применений: вы можете передавать команды в качестве аргументов метода, сохранять их внутри других объектов, переключать связанные команды во время выполнения и т. Д.
Вот пример: вы разрабатываете компонент графического интерфейса пользователя, такой как контекстное меню, и хотите, чтобы ваши пользователи могли настраивать элементы меню, которые запускают операции, когда конечный пользователь щелкает элемент.
Используйте шаблон «Команда», если вы хотите поставить операции в очередь, запланировать их выполнение или выполнить их удаленно.
Как и любой другой объект, команду можно сериализовать, что означает преобразование ее в строку, которую можно легко записать в файл или базу данных. Позже эту строку можно восстановить как исходный командный объект. Таким образом, вы можете отложить и запланировать выполнение команды. Но это еще не все! Таким же образом вы можете ставить в очередь, регистрировать или отправлять команды по сети.
Используйте шаблон «Команда», если вы хотите реализовать обратимые операции.
Хотя есть много способов реализовать отмену / возврат, шаблон Command, пожалуй, самый популярный из всех.
Для возможности отката операций необходимо реализовать историю выполненных операций. История команд — это стек, который содержит все выполненные объекты команд вместе с соответствующими резервными копиями состояния приложения.
У этого метода есть два недостатка.Во-первых, не так просто сохранить состояние приложения, потому что некоторые из них могут быть приватными. Эту проблему можно решить с помощью шаблона Memento.
Во-вторых, резервные копии состояний могут потреблять довольно много оперативной памяти. Поэтому иногда можно прибегнуть к альтернативной реализации: вместо восстановления прошлого состояния команда выполняет обратную операцию. У обратной операции тоже есть цена: она может оказаться трудной или даже невозможной.
Как реализоватьОбъявите командный интерфейс с единственным методом выполнения.
Начать извлечение запросов в конкретные классы команд, реализующие командный интерфейс. Каждый класс должен иметь набор полей для хранения аргументов запроса вместе со ссылкой на фактический объект-получатель. Все эти значения должны быть инициализированы с помощью конструктора команды.
Определите классы, которые будут действовать как отправители . Добавьте в эти классы поля для хранения команд. Отправители должны общаться со своими командами только через командный интерфейс.Отправители обычно не создают объекты команд сами по себе, а получают их из клиентского кода.
Измените отправителей, чтобы они выполняли команду вместо отправки запроса получателю напрямую.
Клиент должен инициализировать объекты в следующем порядке:
- Создайте получателей.
- Создайте команды и при необходимости свяжите их с получателями.
- Создайте отправителей и свяжите их с определенными командами.
- Принцип единой ответственности . Вы можете отделить классы, вызывающие операции, от классов, выполняющих эти операции.
- Принцип открытого / закрытого . Вы можете вводить новые команды в приложение, не нарушая существующий клиентский код.
- Вы можете выполнить отмену / возврат.
- Вы можете реализовать отложенное выполнение операций.
- Вы можете собрать набор простых команд в сложную.
- Код может стать более сложным, поскольку вы вводите совершенно новый уровень между отправителями и получателями.
Цепочка ответственности, команда, посредник и наблюдатель рассматривают различные способы соединения отправителей и получателей запросов:
- Цепочка ответственности последовательно передает запрос по динамической цепочке потенциальных получателей, пока один из них не обработает его.
- Команда устанавливает однонаправленные соединения между отправителями и получателями.
- Посредник устраняет прямые соединения между отправителями и получателями, заставляя их связываться косвенно через объект-посредник.
- Observer позволяет получателям динамически подписываться и отказываться от получения запросов.
- Обработчики
в цепочке ответственности могут быть реализованы как команды. В этом случае вы можете выполнять множество различных операций над одним и тем же объектом контекста, представленным запросом.
Однако есть другой подход, когда сам запрос представляет собой объект Command . В этом случае вы можете выполнить одну и ту же операцию в серии разных контекстов, связанных в цепочку.
Вы можете использовать Command и Memento вместе при выполнении «отмены». В этом случае команды отвечают за выполнение различных операций над целевым объектом, в то время как сувениры сохраняют состояние этого объекта непосредственно перед выполнением команды.
Command и Strategy могут выглядеть одинаково, потому что вы можете использовать их для параметризации объекта с помощью некоторого действия.Однако у них очень разные намерения.
Вы можете использовать команду Command для преобразования любой операции в объект. Параметры операции становятся полями этого объекта. Преобразование позволяет отложить выполнение операции, поставить ее в очередь, сохранить историю команд, отправить команды удаленным службам и т. Д.
С другой стороны, стратегия обычно описывает разные способы выполнения одного и того же действия, позволяя вам поменять местами эти алгоритмы в одном классе контекста.
Prototype может помочь, когда вам нужно сохранить копии команд в истории.
Вы можете рассматривать Visitor как мощную версию паттерна Command. Его объекты могут выполнять операции над различными объектами разных классов.
Состояние
ПроблемаПаттерн состояний тесно связан с концепцией конечного автомата.
Конечный автомат.
Основная идея заключается в том, что в любой данный момент существует конечное число из состояний , в которых может находиться программа. В любом уникальном состоянии программа ведет себя по-разному, и программа может переключаться из одного состояния в другое. мгновенно. Однако, в зависимости от текущего состояния, программа может переключаться или не переключаться в некоторые другие состояния. Эти правила переключения, называемые переходами , также являются конечными и предопределенными.
Вы также можете применить этот подход к объектам.Представьте, что у нас есть класс Document
. Документ может находиться в одном из трех состояний: Черновик,
, Модерация,
и Опубликован,
. Метод публикации
документа работает немного по-разному в каждом состоянии:
- В
Черновик
перемещает документ на модерацию. - В режиме модерации
- В опубликованном
Возможные состояния и переходы объекта документа.
Конечные автоматы обычно реализуются с множеством условных операторов (, если
или переключает
), которые выбирают подходящее поведение в зависимости от текущего состояния объекта. Обычно это «состояние» — это просто набор значений полей объекта. Даже если вы никогда раньше не слышали о машинах с конечным числом состояний, вы, вероятно, реализовали состояние хотя бы раз. Звонит ли следующая структура кода в колокол?
класс Документ
состояние поля: строка
//...
метод publish () - это
переключатель (состояние)
"проект":
state = "модерация"
перерыв
"На модерации":
если (currentUser.role == 'admin')
состояние = "опубликовано"
перерыв
"опубликовано":
// Ничего не делать.
перерыв
// ...
Самая большая слабость конечного автомата, основанного на условных выражениях, проявляется, когда мы начинаем добавлять все больше и больше состояний и зависимых от состояний поведений в класс Document
.Большинство методов будут содержать чудовищные условные выражения, которые выбирают правильное поведение метода в соответствии с текущим состоянием. Такой код очень сложно поддерживать, потому что любое изменение логики перехода может потребовать изменения условных обозначений состояния в каждом методе.
Проблема имеет тенденцию усугубляться по мере развития проекта. Предсказать все возможные состояния и переходы на этапе проектирования довольно сложно. Следовательно, машина с минимальным набором состояний, построенная с ограниченным набором условных выражений, со временем может превратиться в раздутый беспорядок.
РешениеПаттерн «Состояние» предполагает, что вы создаете новые классы для всех возможных состояний объекта и извлекаете все специфические для состояния поведения в эти классы.
Вместо того, чтобы реализовывать все поведения самостоятельно, исходный объект, называемый контекстом , хранит ссылку на один из объектов состояния, который представляет его текущее состояние, и делегирует всю работу, связанную с состоянием, этому объекту.
Документ делегирует работу объекту состояния.
Чтобы перевести контекст в другое состояние, замените объект активного состояния другим объектом, который представляет это новое состояние. Это возможно только в том случае, если все классы состояний следуют одному и тому же интерфейсу, а сам контекст работает с этими объектами через этот интерфейс.
Эта структура может выглядеть аналогично паттерну «Стратегия», но есть одно ключевое отличие. В шаблоне состояния отдельные состояния могут знать друг о друге и инициировать переходы из одного состояния в другое, тогда как стратегии почти никогда не знают друг о друге.
ПсевдокодВ этом примере шаблон State позволяет одним и тем же элементам управления медиаплеера вести себя по-разному в зависимости от текущего состояния воспроизведения.
Пример изменения поведения объекта с объектами состояния.
Главный объект игрока всегда связан с объектом состояния, который выполняет большую часть работы для игрока. Некоторые действия заменяют текущий объект состояния игрока другим, что меняет способ реакции игрока на взаимодействие с пользователем.
// Класс AudioPlayer действует как контекст. Он также поддерживает
// ссылка на экземпляр одного из классов состояния, который
// представляет текущее состояние аудиоплеера.
класс AudioPlayer - это
состояние поля: Состояние
поле UI, громкость, плейлист, текущая песня
конструктор AudioPlayer ()
this.state = новый ReadyState (это)
// Контекст делегирует обработку пользовательского ввода состоянию
// объект. Естественно, исход зависит от того, в каком состоянии
// в настоящее время активно, так как каждое состояние может обрабатывать
// вводим иначе.UI = новый интерфейс пользователя ()
UI.lockButton.onClick (this.clickLock)
UI.playButton.onClick (this.clickPlay)
UI.nextButton.onClick (this.clickNext)
UI.prevButton.onClick (this.clickPrevious)
// Другие объекты должны иметь возможность переключать аудиоплеер
// активное состояние.
метод changeState (state: State) - это
this.state = состояние
// UI-методы делегируют выполнение активному состоянию.
метод clickLock () - это
state.clickLock ()
метод clickPlay ()
штат.clickPlay ()
метод clickNext () - это
state.clickNext ()
метод clickPrevious () является
state.clickPrevious ()
// Состояние может вызывать некоторые методы службы в контексте.
метод startPlayback () - это
// ...
метод stopPlayback () - это
// ...
метод nextSong () - это
// ...
метод previousSong () - это
// ...
метод fastForward (время) равен
// ...
метод перемотки (время) есть
// ...
// Класс базового состояния объявляет методы, которые полностью конкретны.
// состояния должны реализовываться, а также обеспечивает обратную ссылку на
// объект контекста, связанный с состоянием.Государства могут использовать
// обратная ссылка для перехода контекста в другое состояние.
Состояние абстрактного класса
защищенный полевой проигрыватель: AudioPlayer
// Контекст проходит через конструктор состояния. Этот
// может помочь состоянию получить некоторые полезные данные контекста, если оно
// нужный.
Конструктор State (player)
this.player = игрок
абстрактный метод clickLock ()
абстрактный метод clickPlay ()
абстрактный метод clickNext ()
абстрактный метод clickPrevious ()
// Конкретные состояния реализуют различное поведение, связанное с
// состояние контекста.класс LockedState расширяет состояние
// Когда вы разблокируете заблокированного игрока, он может принять одно из двух
// состояния.
метод clickLock () - это
если (player.playing)
player.changeState (новый PlayingState (игрок))
еще
player.changeState (новый ReadyState (игрок))
метод clickPlay ()
// Заблокировано, поэтому ничего не делать.
метод clickNext () - это
// Заблокировано, поэтому ничего не делать.
метод clickPrevious () является
// Заблокировано, поэтому ничего не делать.
// Они также могут запускать переходы между состояниями в контексте.класс ReadyState расширяет состояние
метод clickLock () - это
player.changeState (новый LockedState (игрок))
метод clickPlay ()
player.startPlayback ()
player.changeState (новый PlayingState (игрок))
метод clickNext () - это
player.nextSong ()
метод clickPrevious () является
player.previousSong ()
класс PlayingState расширяет состояние
метод clickLock () - это
player.changeState (новый LockedState (игрок))
метод clickPlay ()
player.stopPlayback ()
игрок.changeState (новый ReadyState (игрок))
метод clickNext () - это
если (событие. двойной щелчок)
player.nextSong ()
еще
player.fastForward (5)
метод clickPrevious () является
если (событие. двойной щелчок)
player.previous ()
еще
player.rewind (5)
Шаблон разработки стратегии
Намерение
- Определите семейство алгоритмов, инкапсулируйте каждый из них, и сделать их взаимозаменяемыми. Стратегия позволяет алгоритму варьироваться независимо от клиентов, которые его используют.
- Захватить абстракцию в интерфейсе, похоронить детали реализации в производных классах.
Задача
Одна из доминирующих стратегий объектно-ориентированной дизайн — это принцип «открыто-закрыто».
Рисунок демонстрирует, как это обычно достигается — инкапсулировать детали интерфейса в базовый класс и похоронить детали реализации в производных классах. Клиенты могут затем соедините себя с интерфейсом, и не нужно испытать потрясения, связанные с изменениями: никакого воздействия при изменении количества производных классов и без влияния при изменении реализации производного класса.
Общей ценностью сообщества разработчиков программного обеспечения в течение многих лет было «максимизировать сцепление и минимизировать сцепление». Объектно-ориентированный проектный подход, показанный на рисунке, направлен на минимизацию связь. Поскольку клиент связан только с абстракцией (т.е. полезная фантастика), а не конкретное воплощение эту абстракцию можно сказать, что клиент практикует «абстрактное сцепление». объектно-ориентированный вариант более общий призыв «свести к минимуму связи».
Более популярная характеристика этой «абстрактной связи». принцип: «Программа для интерфейса, а не реализация».
Клиенты должны предпочесть «дополнительный уровень косвенности» что предоставляет интерфейс (или абстрактный базовый класс). Интерфейс фиксирует абстракцию (т. Е. «Полезную фантастику»). клиент хочет упражняться, и реализация этого интерфейс эффективно скрыт.
Структура
Сущность интерфейса может представлять собой абстрактный базовый класс или ожидания сигнатуры метода клиент. В первом случае иерархия наследования представляет собой динамический полиморфизм.В последнем случае интерфейс сущность представляет собой код шаблона в клиенте и наследование иерархия представляет собой статический полиморфизм.
Пример
Стратегия определяет набор алгоритмов, которые могут использоваться взаимозаменяемо. Виды транспорта в аэропорт — это пример стратегии. Существует несколько вариантов, таких как вождение на собственном автомобиле, такси, трансфер до аэропорта, городской автобус или лимузин. Для некоторых аэропортов также доступны метро и вертолеты. как вид транспорта в аэропорт.Любой из этих режимов транспорта доставят путешественника в аэропорт, и они могут использоваться как взаимозаменяемые. Путешественник должен выбрать Стратегию на основе компромисса между стоимостью, удобством и временем.
Контрольный список
- Определите алгоритм (т. Е. Поведение), который клиент предпочел бы доступ через «точку изгиба».
- Укажите подпись для этого алгоритма в интерфейсе.
- Похороните детали альтернативной реализации в производных классах.
- Клиенты алгоритма подключаются к интерфейсу.
Эмпирические правила
- Стратегия похожа на шаблонный метод, за исключением его детализации.
- Состояние похоже на Стратегию, за исключением своего предназначения.
- Стратегия позволяет изменять внутренности объекта. Декоратор позволяет менять скин.
- Состояние, Стратегия, Мост (и в некоторой степени Адаптер) имеют аналогичные структуры решения. Все они разделяют элементы идиома «ручка / тело».Они различаются по намерениям, то есть они решать разные проблемы. Стратегия
- имеет 2 различных реализации, первая — похож на State. Разница во времени привязки (Стратегия — это шаблон с однократным связыванием, тогда как состояние более динамично).
- Из стратегических объектов часто получаются хорошие наилегчайшие веса.
Поддержите наш бесплатный веб-сайт и приобретите электронную книгу!
- Подробное объяснение 22 шаблонов проектирования и 8 принципов
- 406 хорошо структурированных, легко читаемых страниц без жаргона
- 228 понятных и полезных иллюстраций и диаграмм
- Архив с примерами кода на 4 языках
- Все поддерживаемые устройства: форматы EPUB / MOBI / PDF
Примеры кода
Более подробную информацию, схемы и примеры шаблона разработки стратегии вы можете найти на нашем новом партнерском ресурсе Refactoring.Guru.Шаблон проектирования команд
Намерение
- Инкапсулируйте запрос как объект, тем самым позволяя параметризовать клиенты с разными запросами, очереди или запросы журнала и поддержка отменяемые операции.
- Повысить «вызов метода для объекта» до полного статуса объекта
- Объектно-ориентированный обратный вызов
Задача
Необходимо отправлять запросы к объектам, ничего не зная о запрашиваемая операция или получатель запроса.
Обсуждение
Команда отделяет объект, вызывающий операцию, от объекта
который знает, как это делать. Чтобы добиться этого разделения, дизайнер
создает абстрактный базовый класс, который сопоставляет получателя (объект) с
действие (указатель на функцию-член). Базовый класс содержит execute ()
метод, который просто вызывает действие на получателе.
Все клиенты объектов Command обрабатывают каждый объект как «черный ящик».
просто вызывая виртуальный метод execute ()
объекта всякий раз, когда
клиент требует «услуги» объекта.
Класс Command содержит следующее подмножество: объект, метод, который будет применен к объекту, и аргументы, которые будут переданы, когда метод применяется. Затем метод «выполнить» команды вызывает кусочки собраться вместе.
Последовательности командных объектов могут быть собраны в составные (или макро) команды.
Структура
Клиент, который создает команду, не тот клиент, который выполняет Это. Такое разделение обеспечивает гибкость в выборе времени и последовательности. команд.Материализация команд как объектов означает, что они могут быть прошел, поставил, поделился, загрузил в таблицу и иным образом инструментировал или манипулируют как любой другой объект.
Командные объекты можно рассматривать как «токены», которые создаются один клиент, который знает, что нужно сделать, и передал другому клиент, у которого есть ресурсы для этого.
Пример
Шаблон Command позволяет инкапсулировать запросы как объекты, тем самым позволяя параметризовать клиентов различными запросами.«Чек» в закусочной — это пример паттерна Command. Официант или официантка принимает заказ или команду от клиента и инкапсулирует этот приказ, написав его на чеке. Затем заказ ставится в очередь на повар быстрого приготовления. Обратите внимание, что каждый официант использует блокнот с чеками. не зависят от меню, поэтому они могут поддерживать команды для готовить много разных блюд.
Контрольный список
- Определите командный интерфейс с сигнатурой метода, например
execute ()
. - Создать один или несколько производных классов, которые инкапсулируют некоторое подмножество из следующего: объект «получатель», вызываемый метод, передаваемые аргументы.
- Создать экземпляр объекта Command для каждого отложенного запроса на выполнение.
- Передайте объект Command от создателя (он же отправитель) вызывающей стороне (он же получатель).
- Вызывающая сторона решает, когда
выполнить ()
.
Эмпирические правила
- Цепочка ответственности, командование, посредник и наблюдатель, расскажите, как вы можете разделить отправителей и получателей, но с разными компромиссами.Команда обычно указывает соединение отправитель-получатель с помощью подкласс.
- Цепочка ответственности может использовать команду для представления запросов как объекты.
- Command и Memento действуют как магические жетоны, которые нужно передавать и вызывать позже. В Command токен представляет собой запрос; в Memento, он представляет внутреннее состояние объекта в конкретном время. Полиморфизм важен для Command, но не для Memento, потому что его интерфейс настолько узок, что сувенир можно передать только как ценить. Команда
- может использовать Memento для поддержания состояния, необходимого для отмены операция.
- Макрокоманды могут быть реализованы с помощью Composite.
- Команда, которую необходимо скопировать перед помещением в список истории, действует. как прототип.
- Два важных аспекта паттерна Command: разделение интерфейса (инициатор изолирован от получателя), временное разделение (сохраняет готовый запрос на обработку, о котором будет сказано позже).
Поддержите наш бесплатный веб-сайт и приобретите электронную книгу!
- Подробное объяснение 22 шаблонов проектирования и 8 принципов
- 406 хорошо структурированных, легко читаемых страниц без жаргона
- 228 понятных и полезных иллюстраций и диаграмм
- Архив с примерами кода на 4 языках
- Все поддерживаемые устройства: форматы EPUB / MOBI / PDF
Примеры кода
Дополнительную информацию, схемы и примеры шаблона проектирования Command вы можете найти на нашем новом партнерском ресурсе Refactoring.Guru.Как изменить свои мысли и модели поведения к лучшему
Автор: Jon Jaehnig
Обновлено 29 января 2021 г.
Медицинское заключение: Лорен Фоли
Если у вас есть мысли или модели поведения, которые, как вы знаете, являются нездоровыми или непродуктивными, или даже токсичными для вас самих и окружающих, изменить их может быть сложно.В конце концов, эти шаблоны — часть жизни. Решение о том, что вам нужно изменить свои мысли и модели поведения к лучшему, — огромный шаг, но он может заставить вас задуматься, с чего начать.
Понимание своих мыслей через внимательность
Источник: rawpixel.com
Чтобы изменить свои мысли, вам нужно понять, как работают ваши мыслительные процессы. Это звучит просто, но это немного сложнее, чем можно было ожидать.
Наш разум работает все время, как компьютер, а не только когда мы активно на что-то обращаем внимание или пытаемся что-то понять. Когда вы едете за рулем, принимаете душ, читаете или смотрите телевизор, ваш разум безумно бушует. Сторонники осознанности называют это «обезьяньим умом».
Ваш мозг имеет тенденцию отключаться от обезьяньего разума, но он по-прежнему оказывает огромное влияние на то, как вы думаете и чувствуете. Может быть сложно научиться уделять больше внимания своему обезьяньему разуму, но это может помочь вам понять и активно изменить свое мировоззрение.
Один из лучших способов понять свой обезьяний разум — это процесс, называемый «медитацией осознанности». Это мысленное упражнение, которое обычно используется для снижения стресса, также может помочь вам понять и изменить свои мысли и модели поведения.
Для начала сядьте или лягте удобно. Закрой глаза. Сосредоточьтесь на своем дыхании. Вам не нужно менять дыхание, чтобы сделать его глубже или медленнее, просто обратите внимание на то, как вы чувствуете дыхание, когда оно входит в ваше тело и выходит из него. Скорее всего, вы сможете сосредоточиться на своем дыхании только на несколько мгновений, прежде чем ваш обезьяний ум прервется.Это нормально. Просто запишите, о чем была мысль, и вернитесь к своему дыханию. Постарайтесь сделать это хотя бы пять минут. К концу своего времени вы, возможно, заметили тенденцию в мыслях, которые вас отвлекали. Постарайтесь выполнять это упражнение хотя бы раз в неделю, но работайте не менее пяти минут в день.
После того, как вы сделаете это какое-то время, вы должны больше осознавать, что ваш обезьяний разум говорит вам в течение дня. Если вы активно пытаетесь измениться к лучшему, вероятно, вас сдерживает обезьяний разум.Возможность его перехватить может помочь вам не допустить, чтобы он определял ваше поведение.
Понимание моделей вашего поведения с помощью ретроспективы
Ваш обезьяний разум может контролировать ваше поведение, но ваше поведение легче наблюдать, чем ваш обезьяний разум. Скорее всего, если вы в первую очередь заинтересованы в изменении своих мыслей и моделей поведения, возможно, именно ваше поведение дало вам понять, что что-то не так.
Наблюдение за своим поведением — это активное занятие, но оно не обязательно требует медитации.Просто нужно обращать внимание на то, что вы чувствуете своим поведением. Иногда поведение, которое вы хотите изменить, является привычкой. Это означает, что может быть трудно не сделать этого, даже если вы потом пожалеете об этом. Итак, относитесь к этому поведению так же, как вы относились к своим навязчивым мыслям в приведенном выше упражнении на осознанность. То есть не ругайте себя, просто обратите внимание на то, что они заставляют вас чувствовать, и посмотрите, какие тенденции вы можете заметить. Это может сделать две важные вещи.
Во-первых, он может помочь вам понять цепочки событий, которые могут привести к вашему нежелательному поведению или к отдельным событиям, которые могут вызвать такое поведение. Например, возможно, вы ведете себя нежелательно только тогда, когда находитесь с определенными людьми, или если вы пьете, или когда у вас был плохой день на работе. Как только вы распознаете вещи, которые приводят к вашему нежелательному поведению, вы можете обнаружить, что можете прервать цепочку событий.
Во-вторых, напоминание себе о негативных чувствах, которые вы испытываете после выполнения нежелательного поведения, может помочь вам избежать этого.Иногда мы знаем, что обсуждаем негативное поведение, но можем забыть о том, как это заставляет нас чувствовать себя позже. Напоминание себе о своем прошлом сожалении о своем поведении до того, как вы это сделаете, может помочь вам убедить себя, что такое поведение того не стоит.
Понимание моделей вашего поведения через окружающих
Источник: pxhere.com
Иногда мы не понимаем, что не так в нашем поведении; мы знаем только то, что это вредит окружающим.В этом случае может быть сложно самостоятельно отслеживать свои модели поведения и чувства, как описано выше, но это не означает, что у вас нет надежды.
Если вы не понимаете, как ваше поведение вредит другим или даже какое поведение вызывает проблему, вы можете часто узнать об этом, спросив их. Это может показаться немного неловким, но если вы искренне относитесь к другим, когда спрашиваете их, они обычно поймут и дадут свой совет.
Если вы знаете, какое поведение хотите изменить, можно легко связаться с людьми, на которых оно влияет.Попробуйте начать разговор с чего-то вроде: «Я пытаюсь изменить X в себе, и я думаю, что мне будет легче, если я пойму, что это вызывает у других».
Если вы не знаете, какое поведение хотите изменить — вы просто знаете, что это должно быть изменение — может быть труднее найти людей, с которыми можно поговорить. Подумайте о том, чтобы начать с близких вам людей, например, членов семьи и коллег. Вам не нужно начинать с того, что вы «владеете» своим негативным поведением. Вместо этого вы можете начать разговор с чего-то вроде: «Я пытаюсь стать лучше, но не знаю, с чего начать.Есть ли что-то, что я говорю или делаю, что вас расстраивает? «
Может показаться, что вы открываете для себя неприятные отзывы. Столкновение с тем, что вам нужно изменить свое поведение, может быть трудным, но это путешествие, которое вы уже начали. Если вы честны с кем-то, когда просите его о помощи, он вряд ли воспользуется ею как предлогом, чтобы заставить вас чувствовать себя плохо. Постарайтесь помнить, что они заботятся о ваших интересах, даже если они дают обратную связь, которую трудно услышать.
Понимание ваших мыслей и моделей поведения посредством наблюдения
Понимание того, откуда берутся ваши мысли или модели поведения, может помочь вам изменить их к лучшему. Иногда мы не знаем, откуда берутся наши мысли или модели поведения. Однако в других случаях мы можем распознать наши негативные мысли или модели поведения в окружающих. Возможно, это люди, у которых мы их взяли. Иногда мы заимствуем негативное поведение от родителей, коллег или друзей.Часто мы понимаем, что вели себя неприемлемо, когда узнаем себя в ком-то другом.
Определение того, где вы заметили нежелательное поведение, может помочь вам понять, как его избежать, а также куда не обращаться за советом по его устранению.
Почему некоторые модели поведения трудно изменить
Даже если вы поймете, в чем заключается ваше негативное поведение, откуда оно взялось и что к нему ведет, может быть трудно изменить образ мышления и поведения.Причина этого может быть сложной, но есть несколько основных тенденций.
Некоторые модели мышления и поведения трудно изменить, потому что, даже если вы больше не хотите ими заниматься, они социально приемлемы — или даже поощряются. Яркие примеры включают такие вещи, как употребление алкоголя или психоактивных веществ, переедание и другие виды деятельности. Каким бы ни было поведение, оно, вероятно, поощряется в определенных условиях или социальных условиях. В этом случае вам может потребоваться удалить себя из этой среды или социальной группы, чтобы избежать побуждений к проявлению нежелательных мыслей или моделей поведения.
Источник: pexels.com
Некоторые паттерны негативного поведения могут поощряться вашим телом, что затрудняет их преодоление. Некоторые виды негативного поведения обычно заставляют нас чувствовать себя хорошо, потому что они основаны на здоровом поведении или имитируют его и сбивают с толку систему химического вознаграждения вашего тела. Если вы слишком часто допускаете такое поведение, ваше тело может ассоциировать его с гормонами хорошего самочувствия, что приведет к поведенческой зависимости, химически похожей на расстройство, вызванное употреблением психоактивных веществ.Это может иметь место при употреблении определенных продуктов, игре в видеоигры, сексе и других занятиях.
Если вам нужна помощь
Иногда, несмотря на все наши усилия и намерения, мы просто не в состоянии преодолеть свои нежелательные мысли или модели поведения. Образ мыслей может быть слишком глубоко укоренен в наших ментальных процессах, или поведение может быть слишком сильно врезано в наш центр вознаграждения. В этом случае вам может потребоваться помощь.
Источник: pexels.com
Можно начать с разговора со своим лечащим врачом, особенно если ваше поведение вредит вашему здоровью. Они смогут направить вас к ресурсам сообщества.
Другой вариант — обратиться к онлайн-группам поддержки, общественным центрам и местным службам психического здоровья. Многие нежелательные мысли и модели поведения встречаются чаще, чем мы думаем, и во многих сообществах есть группы поддержки для людей, которые их переживают.
Наконец, вы можете встретиться с психологом или терапевтом.Это может показаться пугающим и дорогостоящим. Однако поиск терапевта или консультанта в Интернете может помочь решить эти проблемы. Онлайн-терапевты и консультанты более доступны и удобны, чем личные встречи с консультантами или терапевтами.
Исследование показало, что онлайн-терапия может быть более индивидуальной, чем традиционная. Девяносто шесть процентов людей, использующих онлайн-терапию, сообщили, что чувствуют личную связь со своими онлайн-терапевтами, по сравнению с 91 процентом, которые обращались к терапевтам лицом к лицу.Они также больше вкладывались в выполнение домашних заданий, которые назначали им терапевты, и время от времени просматривали переписку между ними и их терапевтами, побуждая их двигаться вперед в своей жизни.
Как BetterHelp может вас поддержать
Если вы обнаружите, что снова возвращаетесь к старым образцам мышления и поведения, обратитесь в BetterHelp. Вам подберут лицензированного терапевта или консультанта, который научит вас методам борьбы с нежелательными мыслями и поведением и их изменения, предлагая эмоциональную поддержку и понимание.Вы сможете встретиться со своим онлайн-терапевтом, не выходя из дома и в удобное для вас время. Ниже приведены некоторые отзывы о консультантах BetterHelp от людей, испытывающих аналогичные проблемы.
Отзывы консультанта
«Доктор. Стритер прислушивается к моим опасениям, независимо от того, насколько они велики или малы, и помогает увидеть ситуации с других точек зрения. Они всегда предоставляют мне дополнительные ресурсы для исследования или предлагают мне способы научиться быть более осознанными, отучиться от поведения, которое больше не служит мне, и укрепить новые поведенческие цели.Я очень рекомендую доктора Стритера !! »
«Надежда очень хорошо умеет оценивать то, что я не говорю, а то, что я есть на самом деле, и очень хороша в том, чтобы добраться до сути вещей и помочь мне определить мыслительные процессы и модели поведения, которые присутствуют в моей жизни. Я очень ценю ее идеи и инструменты! »
Как распознать повторяющиеся модели мыслей, эмоций и поведения
, автор — Моника Валанкевич
Чтобы распознать повторяющийся паттерн, нужна радикальная честность и хорошая доза сострадания к себе.Иногда наше повторяющееся поведение и переживания становятся настолько укоренившимися, что кажутся частью нашей личности. Когда мы неоднократно оказываемся в похожей, но нежелательной ситуации или когда повторяем один и тот же сценарий снова и снова, не зная почему, это может означать, что мы попали в повторяющийся цикл.
Первый шаг к освобождению — это распознать шаблон, какой он есть. Один из способов сделать это — сделать шаг назад и посмотреть на ситуацию через более широкий объектив.
Многие техники могут помочь нам отдалиться от наших мыслей и эмоций, медитация — самая известная из них.Однако ведение дневника, особенно запись в потоке сознания, в которой вы не подвергаете себя цензуре и просто позволяете словам течь по странице, также позволяет вам отойти на расстояние, необходимое для распознавания образов. Итак, возьмите лист бумаги и подумайте о своем прошлом и настоящем.
Вы находитесь в ситуации, которая вызывает знакомое чувство дискомфорта? Эта ситуация напоминает вам что-то из вашего прошлого? Обычно существует активная связь между прошлым и настоящим.Спросите себя, что привело вас туда, где вы находитесь. Замечаете ли вы какие-либо ситуации, которые имеют тенденцию повторяться, например, когда вы постоянно общаетесь с людьми одного и того же типа или постоянно упускаете возможности из-за того, что не чувствуете, что вы «достаточно хороши»? Иногда это не так очевидно и заметно, но суть ситуации может быть той же, то есть заставляет вас чувствовать то же самое. Присутствует сильное чувство близости или дежавю, хотя обстоятельства могут быть очень разными. Это похоже на дом, но не в хорошем смысле.Примите это к сведению. Это ваша подсказка, ведущая к раскрытию закономерности.
Затем поищите шаблоны, которые имеют более внутренний характер, например, шаблон негативного разговора с самим собой. Может быть, вы постоянно унижаете себя или склонны к катастрофам. Эти шаблоны побуждают вас делать определенный выбор и вести себя определенным образом, поэтому рано или поздно они проявятся внешне. То же самое и с эмоциями. Есть ли негативные эмоции, которые всегда присутствуют на фоне вашей жизни? Есть ли эмоции, которые вы испытываете при повторении? Вам кажется, что вы перерабатываете одни и те же чувства, и часто они не отражают то, что происходит в вашей жизни в данный момент? Это подсказки, которые помогут вам определить закономерность, которая потенциально может саботировать ваши сознательные усилия.
Как только вы распознаете шаблон, вы можете начать искать убеждения, которые его создали, и вот как вы отпустите его. Выявление паттерна — это первый шаг на пути к исцелению, это положительный шаг, потому что вы не можете исцелить то, о чем не знаете.
Я не зря упомянул сострадание к себе, так как увидеть наши модели при ярком свете дня может быть трудно и вызвать у нас чувство вины или стыда. Вы хотите избежать попадания в эту ловушку. Относитесь к себе, как к лучшему другу или к любимому человеку.Каждый из нас несет эмоциональный багаж, делает то, чем не гордится, и время от времени терпит неудачу. Естественно и по-человечески реагировать на старые обиды и истории, формируя определенные модели поведения или опыта. То, что вы делаете, — это проявление смелости, поэтому проявите немного любви и прощения.
Моника Валанкевич — выпускница CiPP, UX-дизайнер, коуч, спикер и фасилитатор. Она имеет сертификат арт-терапии Северо-Западного университета и помогает своим клиентам преодолевать невзгоды и избавляться от повторяющихся психологических паттернов, которые мешают им действовать в своей жизни.Моника возглавляет организационные изменения в Allstate Corporation, распространяя в компании инструменты позитивной психологии для повышения уровня благополучия и удовлетворения. Она использует уникальный подход, сочетающий интуитивную и творческую внутреннюю работу с научно обоснованными методами, основанными на поведенческой науке и позитивной психологии, и делится своим опытом в области личностного роста через семинары, корпоративные выступления и индивидуальный коучинг.