Что такое поведенческие паттерны и какими они бывают – Конструктор Успеха
Что такое паттерн? В психологии паттерн в широком смысле слова — это определенный шаблон, модель действий или реакций, которая используется человеком. В узком значении слова паттерн может означать:
- Набор определенных фраз, используемых в гипнозе для введения пациента в состояние транса.
- Набор повторяющихся действий, которые приводят к определенному результату в НЛП.
- Стереотип мышления или поведения.
Паттерны используются индивидом как осознанно, так и неосознанно. Человек не в состоянии контролировать свои действия и реакции ежесекундно. Если бы ему приходилось постоянно задумываться над каждым словом и движением, сознание быстро бы «устало» от таких объемов работы. Это происходит благодаря рациональному подходу: проще выхватить готовую модель поведения, уже использовавшийся ранее блок, чем заново придумывать «ответ» в определенной ситуации.
Паттерн в психологии
Человек использует паттерны в каждой сфере своей жизни, поэтому это явление распространенное.
- Утром по дороге на работу вы встречаете соседку по лестничной площадке. Хотя вы витаете далеко в облаках, на ее приветствие машинально вежливо отвечаете «Доброе утро». Ваше приветствие «на автомате» — это социальный паттерн поведения.
- Вы просыпаетесь после бессонной ночи в обнимку с книжкой, с большим трудом открываете глаза, уныло плететесь в ванную комнату, открываете кран, берете зубную щетку, начинаете чистить зубы. Ваше сознание начинает просыпаться только в тот момент, когда вы уже прополоскали рот. Вы совершали весь этот утренний ритуал неосознанно. Это еще один положительный паттерн поведения. О них мы поговорим более подробно дальше.
- Культурные паттерны — это особенности, которые характерны для конкретной социальной группы (народа, племени). Совокупность ценностей, верований, которые отличают эту народность от всех остальных. К примеру, при виде рыжей лисицы на картинке книжки сказок, русский ребенок испугается или насторожится, потому что лиса в нашей культуре — символ хитрости и изворотливости. Японский ребенок, увидев серебристую лисицу, да еще с девятью хвостами, улыбнется. Почему? Потому что в Стране восходящего солнца лисица олицетворяет мудрость. По мере взросления кэцуне седеет и обзаводится дополнительными хвостами.
- Яркий речевой паттерн в русском языке — это слова-паразиты. К примеру, многие привыкли заполнять паузы многозначительным «эээ» или протяжным «нуууу». Если не знаете что сказать, тогда мычите (простейший речевой паттерн).
В психологии паттерн считается составной единицей бессознательного. Некоторые сравнивают его с привычкой, что недалеко от истины. С точки зрения физиологии паттерны возникают по такой же схеме, что и рефлексы или инстинкты, но с точки зрения психологии это явление более «объемное».
Паттерны в примерах
Большой интерес представляет механизм работы паттерна. Чтобы «запустить» шаблон, достаточно затронуть какую-либо из его составных частей, то есть он активируется сразу же после активации отдельного элемента этой модели. Вспомним соседку по лестничной площадке, о которой упоминалось выше. Чтобы поздороваться, вам не обязательно услышать ее приветствие. Вы машинально пожелаете ей доброго утра, даже если заметите краем глаза во дворе.
Психологические шаблоны — это не набор бессмысленных «ритуальных» действий и реакций. Они, наоборот, наполнены смыслом, но сознание «освободилось» от этой информации, которая при регулярном повторении становится лишней. При этом информация сохраняется, но в ней нет необходимости, раз сознание уже вывело правильную поведенческую схему, то есть паттерн — это результат накопленных знаний и опыта.
Поведенческая схема может измениться только в том случае, если произойдут изменения в условиях, при которых обычно применялся паттерн. Чтобы смысл сказанного был более понятен, приведем еще два примера:
- После прихода домой, вы снимаете верхнюю одежду и обувь, идете к раковине и моете руки. Мытье рук после улицы — это паттерн здорового человека.
- Вы сидите дома и каждые две-три минуты посещаете ванную, чтобы помыть руки. Все потому, что вам кажется, что на них кишмя кишат бактерии и микробы, как в рекламе одного известного чистящего средства. Хотя ваши действия повторяются с завидной регулярностью — это не паттерн. Поздравляем, вы страдаете от обсессивно-компульсивного расстройства.
Не все повторяющиеся действия — это паттерн, но паттерн — это всегда шаблон.
Паттерны поведения
Поведенческие паттерны — это модели реакций, которые сохраняются в сознании каждого человека. Оно вешает ярлык «шаблон» на набор действий после того, как эта модель хорошо себя зарекомендовала и «выручила» в конкретном случае. При ее повторении, сознание вытащит из шкафа с паттернами нужный шаблон, снимет его с вешалки и «подсунет» человеку, как «тренд» этой ситуации.
Чем чаще паттерн используется, тем меньше человек задумывается над моделью действий. Он просто машинально ее совершает, будучи при этом мысленно занят совершенно другими вещами. Паттернов намного больше, чем может себе представить среднестатистический человек. Их классификация очень разветвленная:
- Индивидуальные и социальные. Первые — это привычки человека и личные модели поведения, которые свойственны только для конкретного индивида. Социальные паттерны можно назвать совокупностью культурного развития и воспитания. Эти навыки помогают выживать человеку в обществе. Выживать конечно громко сказано, но уж не прослыть диким невеждой эти шаблоны точно помогут. К социальным паттернам можно отнести привычку здороваться, пожимать руки при встрече, пропускать женщину вперед, открывать двери для выходящих из здания. Социальные паттерны еще можно назвать вежливостью и умением вести себя в обществе.
- Позитивные и негативные. Здесь все очень просто. Позитивные паттерны облегчают жизнь человека. К примеру, чистить зубы по утрам — это позитивный паттерн, а тянуть свои ручонки к пачке сигарет — негативный. Негативные паттерны отравляют жизнь человека. Многие из них по степени негативного влияния больше походят на неврозы, поэтому лечатся только при участии психотерапевта.
- Врожденные и приобретенные. Врожденные паттерны — это результат накопления знаний предков на генетическом уровне. К примеру, реакция на перелом ноги — крик. Это врожденный паттерн. Приобретенные шаблоны поведения — это результат накопленного опыта отдельного индивида. Их во многом определяет окружающая среда, воспитание, круг общения.
Паттерны поведения начинают формироваться еще в раннем детстве. Маленький ребенок похож на губку. Он жадно впитывает информацию. Если данные не отфильтруют родители или воспитатели, то малыш может подхватить много ненужного мусора и выработать в сознании неправильные паттерны, которые впоследствии станут негативными.
Следить за формированием моделей поведения у ребенка необходимо, потому что искоренить неправильные шаблоны проще всего именно в раннем возрасте, когда детская психика еще сохраняет гибкость. К примеру, можно приучить ребенка к самодисциплине, используя простой метод: сначала полезное действие, а потом приятная награда (убери игрушки в ящик, а потом возьми конфету). Этот способ поможет приучить ребенка сохранять порядок и справляться с соблазнами.
Некоторые люди могут использовать свои знания о паттернах для манипулирования другими (конечно, в корыстных целях). Шаблоны могут сыграть с вами злую шутку, если найдется человек, который изучит их достаточно хорошо и научится предугадывать, какую модель поведения предложит ваше сознание в той или иной ситуации.
Если вы хотите изучить шаблоны поведения более глубоко, то рекомендуем к прочтению книгу Эрика Берна «Люди, которые играют в игры. Игры, в которые играют люди». В этом издании простым и доступным языком, без переизбытка заумной терминологии автор излагает теорию шаблонов, по полочкам раскладывает паттерны и их влияние на жизнь человека.
Книгу можно смело назвать практическим пособием по психологии для «чайников».
Что такое паттерн поведения в психологии простыми словами с примерами
Кто из нас не рассматривал затейливые рисунки на обоях, стенах, тканях. Если ты умеешь вязать, то понятие раппорт тебе хорошо знакомо: это один и тот же рисунок, который повторяется в изделии много раз через определённые промежутки. Впрочем, само вязанное изделие состоит из многих петель.
Фото автора Katie E: Pexels
Проследи за своим дыханием: вдох следует за выдохом. Это повторяется автоматически. Ты не задумываешься об этих действиях. Если задаться целью, и отследить своё поведение в течении дня, можно заметь:
- повторяющиеся действия, доведённые да автоматизма,
- слова, их называют «паразитами», которые ты повторяешь в разных ситуациях, и не замечаешь этого;
- эмоции, возникающие в ответ на внешние воздействия.
В этой статье:
Определение понятия паттернаОсновные свойства паттернаКлассификация паттерновТочка отсчётаСущество привычкиХорошо и плохоПаттерны в общенииКак изменить паттернПаттерны в психологии
Новости СМИ2
Определение понятия паттерна
Всё это имеет название – паттерн. Паттерн, в дословном переводе с английского языка, имеет значение – узор, шаблон, схема, модель, образец. Синонимом понятия паттерна можно определить – регулярность.
Если объединить, то получается, что паттерн – схема или модель, повторяющаяся автоматически, благодаря которой выявляются закономерности в природе, обществе, восприятии и поведении человека. Паттерн в психологии – это набор поведенческих реакций или устойчивая последовательность действий, а также объединение сенсорных стимулов, возникающих для характеристики определённых внешних объектов.
Основные свойства паттерна
Паттерны встречаются в любой области деятельности, и ты постоянно имеешь с ними дело в своей повседневной жизни. Паттерны обладают определёнными свойствами, по которым из можно легко распознать:
- постоянное устойчивое повторение;
- бессознательная природа проявления, определяющаяся чётким алгоритмом, который сложно откорректировать;
- полное или частичное проявление алгоритма повторения. Если повторение не полное, то оно носит название кода, и служит пусковым механизмом для исполнения всей схемы паттерна. Метод кодирования широко используется в психологии для коррекции психологических реакций на разные виды внешних раздражителей;
- в психологии различные паттерны редко существуют в отдельности друг от друга. Начальной точкой считается врождённый паттерн, на который накладываются другие схемы в процессе приобретения соответствующего жизненного опыта. Таким образом образуются стереотипы поведения, привычки, которые, неизбежно, влияют на формирование характера человека и его образ жизни;
- постоянное развитие и образование новых видов паттернов. Алгоритмы паттернов могут меняться по мере приобретения тобой соответствующего жизненного опыта. Примером такой трансформации паттерна может служить изменение типа твоего поведения, когда ты начинаешь жить с кем-то в паре. Холостяцкие привычки, некоторое время, проявляются очень ярко, но, со временем, они заменяются на новые виды поведения.
Что такое паттерн поведения в психологии?
Классификация паттернов
В области психологии, поведенческие паттерны имеют свою классификацию. Выделяются:
- врождённые или наследственные;
- приобретённые или творческие;
- позитивные или комфортные;
- негативные или ошибочные;
- социальные и индивидуальные;
- коммуникативные.
Каждый из этих классов, в свою очередь, делится по месту и качеству своего проявления. Рассмотрим подробнее на примерах основные виды паттернов в психологии.
Точка отсчёта
Врождённые или наследственные паттерны являются отправной точкой для формирования и развития других поведенческих шаблонов, которое возникают в процессе взросления и развития человека. Они отличаются самой устойчивой природой проявления. К этому виду относятся любые типы физиологических процессов в организме, инстинкты и реакции, например, такие как ответ на физическую боль.
Существо привычки
На основе врождённых паттернов, как ты уже наверно понимаешь, формируются паттерны приобретённые. Их развитие происходит в процессе воспитания, образования, взаимодействия с другими людьми.
Определяющим в развитии приобретённых шаблонов является твой жизненный опыт. Например, каждое утро ты чистишь зубы. Это не является твоим врождённым паттерном, но ритуал повторяется тобой регулярно. Он результат твоего воспитания.
Хорошо и плохо
По сути, все остальные классы поведенческих паттернов являются разновидностями приобретённых. Совсем не секрет, что каждый человек формирует большое количество вредных и полезных привычек, навыков. Они существенно влияют на качество твоей жизни, и от некоторых очень сложно избавиться.
Примером негативного паттерна может служить курение. Ты начинаешь нервничать или испытываешь чувство расслабления, и возникает желание выкурить сигарету. Кто имел опыт борьбы с этой вредной привычкой, хорошо знает, как тяжело проходит процесс отказа от неё.
К приобретённым паттернам относятся и шаблоны поведения. Стеснительному и замкнутому человеку очень сложно выходить на открытое общение с другими людьми, и это откладывает отпечаток на развитие его личности и мешает социальной реализации.
Преодоление подобных стереотипов поведения требует посторонней помощи, и лучше обратиться к опытному специалисту. Он поможет выявить причины, которые послужили началом для формирования паттерна, и, с помощью определённых методов психологической коррекции, шаблон будет изменён в сторону более комфортной психологической реакции.
Паттерны в общении
Если понаблюдать за поведением людей в их обычной, повседневной жизни, то можно отметить, что каждый из нас, в процесс взаимодействия с другими людьми, использует широкую гамму мимики, систему жестов, набор стандартных словосочетаний. При встрече, ты здороваешься, на твоём лице возникает соответствующая эмоциональная маска. Это коммуникативные паттерны. На основе их можно сделать вывод об эмоциональном состоянии собеседника, его наклонностях, и даже типе его личности.
Среди отрицательных коммуникативных паттернов можно выделить жесты или слова, от которых сложно избавиться, и приходится некоторое время постоянно находиться в состоянии осознанного общения, что доставляет определённые неудобства, так как присутствует внутреннее эмоциональное, иногда, физическое напряжение.
Реализацию коммуникативных паттернов можно наблюдать при общении двух слабослышащих людей. Они разговаривают с помощью определённых жестов, за каждым из которых закрепляется смысловое значение.
Как изменить паттерн
Изменение паттерна процесс очень сложный и продолжительный, который требует от человека концентрации внимания и настойчивого намерения его изменить. Особенно важно желание человека изменить шаблон поведения, если речь идёт о фобиях, зависимостях.
Успешным методом изменения, коррекции приобретённых паттернов является гипнотерапия. При помощи сеанса гипноза, при участии грамотного специалиста, можно изменить или справиться с любым негативным поведенческим паттерном.
Паттерны в психологии
Паттерн – это термин, обозначающий некий повторяющийся шаблон, также им можно назвать образец, модель, схему или образ. Понятие пошло от английского «pattern» и переводится, как пример, форма. Паттерн представляет собой повторяющийся образец или шаблон, компоненты которого повторяются предсказуемо.
Паттерны могут восприниматься неодинаково, это зависит от органа ощущений, которым они чувствуются. Существуют разнообразные паттерны поведения. Примеры их можно увидеть в различных сферах жизнедеятельности: от ранних умываний до специальных профессиональных действий.
Так, например, они встречаются в таких науках, как психология, физика, информатика. Часто применяются в дизайне, музыке, творчестве. Такая схема поведения воспроизводится человеком автоматически в процессе взаимодействия с окружающим миром. Ежедневные паттерны поведения: утренние умывания, приветствия, манера поведения за столом.
В психологии паттерном называется парадигма поведения, свойственная человеку в каких-нибудь ситуациях и обстоятельствах. В медицине паттерн воспринимается как устойчивая комбинация результатов исследования или иных признаков, симптомов при похожих жалобах больного или больных с одной нозологией.
Так, паттерн состоит из нескольких симптомов, признаков. Синдром, в свою очередь, включает один или пару паттернов. Синдром или несколько синдромов составляют болезнь. Паттерны имеют характерные свойства:
- они являются постоянной категорией, которую легко определить;
- они всё время повторяются;
- они являются бессознательно созданными алгоритмами, которые, как правило, очень сложно скорректировать;
- они способны проявляться полностью или частично. Если он выявляется частично, то его называют кодом. Например, человек услышал отрывок из какой-то песни, и у него перед глазами сразу отображаются картины из определенной впечатляющей ситуации из прошлого, его захватывают эмоции и воспоминания, которые связанные с ней. Таким образом, мелодия была кодом, произношение которого запустило весь паттерн.
Врожденный паттерн является отправной точкой, первоначальным шаблоном, на который наслаиваются другие. Такие комбинации паттернов объединяются со стереотипами, привычками и ценностями человека, формируя его характер и образ жизни. Поэтому, такие шаблоны всегда взаимодействуют и не могут существовать по отдельности.
Психологический паттерн отображает устойчивую модель поведения индивидов. Такие поведенческие паттерны можно увидеть, наблюдая за окружающими людьми. Все ведут себя в разнообразных обстоятельствах по-разному, но всё-таки каждый индивид придерживается собственного стиля.
Например, если человек по своей натуре неразговорчив, достаточно замкнутый, и предпочитает проводить свое свободное время в одиночестве или компании одного друга, то естественно, он будет себя чувствовать очень неловко в большой компании и может даже обидеться, если его без предупреждения затянули в такое шумное общество.
Следует выходить из интересов человека, чтобы предугадать, какая реакция у него может возникнуть, соответственно действовать так, чтобы никто не был обижен. Наблюдать то, как проявляются и меняются паттерны поведения людей очень полезное и интересное занятие. В психологии существует такой вид паттернов, как гипнотические.
Это особые повторяющиеся словесные формулы, с помощью которых человека можно погрузить в гипнотическое трансовое состояние. Может случиться так, что человек даже не догадается о том, что его погрузили в гипноз. Такой метод широко применяется в нейролингвистическом программировании, а манипуляторы хорошо им владеют в корыстных целях.
Если у человека случаются такие ситуации, в которых он переживает трудности взаимодействия с внешним миром, он ищет помощи у психолога. Высказав всё наболевшее, пройдя некоторое количество тестов, клиент часто может услышать от психолога, что дело заключается в его негативной модели поведения. В дальнейшем клиенту назначается курс психокоррекции.
Цепочка ответственности
/ Шаблоны проектирования / Модели поведения
Также известен как: CoR, Chain of Command
НамерениеЦепочка ответственности — это поведенческий шаблон проектирования, позволяющий передавать запросы по цепочке обработчиков. Получив запрос, каждый обработчик решает либо обработать запрос, либо передать его следующему обработчику в цепочке.
ПроблемаПредставьте, что вы работаете над системой онлайн-заказов. Вы хотите ограничить доступ к системе, чтобы только авторизованные пользователи могли создавать заказы. Кроме того, пользователи с правами администратора должны иметь полный доступ ко всем заказам.
После небольшого планирования вы поняли, что эти проверки должны выполняться последовательно. Приложение может попытаться аутентифицировать пользователя в системе всякий раз, когда оно получает запрос, содержащий учетные данные пользователя. Однако, если эти учетные данные неверны и аутентификация не удалась, нет причин продолжать какие-либо другие проверки.
Запрос должен пройти ряд проверок, прежде чем система заказов сможет его обработать.
В течение следующих нескольких месяцев вы реализовали еще несколько таких последовательных проверок.
Один из ваших коллег предположил, что передавать необработанные данные прямо в систему заказов небезопасно. Итак, вы добавили дополнительный шаг проверки для очистки данных в запросе.
Позже кто-то заметил, что система уязвима для взлома паролей методом грубой силы. Чтобы предотвратить это, вы быстро добавили проверку, которая отфильтровывает повторяющиеся неудачные запросы, поступающие с одного и того же IP-адреса.
Кто-то еще предложил ускорить работу системы, возвращая кэшированные результаты при повторных запросах, содержащих одни и те же данные. Следовательно, вы добавили еще одну проверку, которая пропускает запрос в систему, только если нет подходящего кэшированного ответа.
Чем больше код рос, тем запутаннее он становился.
Код чеков, и без того выглядевший кашей, становился все более и более раздутым по мере добавления каждой новой функции. Изменение одного чека иногда влияло на другие. Хуже всего то, что когда вы пытались повторно использовать проверки для защиты других компонентов системы, вам приходилось дублировать часть кода, поскольку эти компоненты требовали некоторых проверок, но не всех.
Система стала очень сложной для понимания и дорогой в обслуживании. Вы какое-то время боролись с кодом, пока однажды не решили провести рефакторинг всего этого.
РешениеКак и многие другие поведенческие шаблоны проектирования, цепочка ответственности полагается на преобразование определенных поведений в автономные объекты, называемые обработчиками . В нашем случае каждая проверка должна быть извлечена в свой класс с помощью одного метода, выполняющего проверку. Запрос вместе со своими данными передается этому методу в качестве аргумента.
Шаблон предлагает связать эти обработчики в цепочку. Каждый связанный обработчик имеет поле для хранения ссылки на следующий обработчик в цепочке. Помимо обработки запроса, обработчики передают запрос дальше по цепочке. Запрос перемещается по цепочке до тех пор, пока все обработчики не получат возможность его обработать.
Вот лучшая часть: обработчик может принять решение не передавать запрос дальше по цепочке и эффективно остановить дальнейшую обработку.
В нашем примере с системами заказов обработчик выполняет обработку, а затем решает, передать ли запрос дальше по цепочке. Предполагая, что запрос содержит правильные данные, все обработчики могут выполнять свое основное поведение, будь то проверка подлинности или кэширование.
Дрессировщики выстраиваются один за другим, образуя цепочку.
Однако есть немного другой подход (и он немного более каноничный), при котором, получив запрос, обработчик решает, может ли он его обработать. Если это возможно, он не передает запрос дальше. Таким образом, либо только один обработчик обрабатывает запрос, либо вообще ничего. Этот подход очень распространен при работе с событиями в стеках элементов в графическом пользовательском интерфейсе.
Например, когда пользователь нажимает кнопку, событие распространяется по цепочке элементов графического интерфейса, которая начинается с кнопки, проходит по ее контейнерам (таким как формы или панели) и заканчивается главным окном приложения. Событие обрабатывается первым элементом в цепочке, способным его обработать. Этот пример также примечателен тем, что он показывает, что цепочку всегда можно извлечь из дерева объектов.
Цепочка может быть сформирована из ветви дерева объектов.
Крайне важно, чтобы все классы обработчиков реализовывали один и тот же интерфейс. Каждый конкретный обработчик должен заботиться только о следующем, имеющем метод execute
. Таким образом, вы можете создавать цепочки во время выполнения, используя различные обработчики, не связывая свой код с их конкретными классами.
Звонок в службу технической поддержки может проходить через нескольких операторов.
Вы только что купили и установили на свой компьютер новое оборудование. Поскольку вы гик, на компьютере установлено несколько операционных систем. Вы пытаетесь загрузить их все, чтобы увидеть, поддерживается ли оборудование. Windows автоматически обнаруживает и включает оборудование. Однако ваш любимый линукс отказывается работать с новым железом. С небольшим проблеском надежды вы решаете позвонить по телефону техподдержки, указанному на коробке.
Первое, что вы слышите, это механический голос автоответчика. Он предлагает девять популярных решений различных проблем, ни одно из которых не имеет отношения к вашему делу. Через некоторое время робот подключает вас к живому оператору.
Увы, ничего конкретного оператор подсказать тоже не может. Он продолжает цитировать длинные выдержки из руководства, отказываясь слушать ваши комментарии. Услышав фразу «вы пробовали выключить и снова включить компьютер?» в 10-й раз вы требуете, чтобы вас соединили с настоящим инженером.
В конце концов, оператор передает ваш звонок одному из инженеров, который, вероятно, часами жаждал живого человеческого общения, сидя в своей одинокой серверной в темном подвале какого-то офисного здания. Инженер расскажет вам, где скачать подходящие драйверы для вашего нового оборудования и как установить их в Linux. Наконец-то решение! Вы заканчиваете разговор, разрываясь от радости.
СтруктураОбработчик объявляет интерфейс, общий для всех конкретных обработчиков. Обычно он содержит только один метод для обработки запросов, но иногда может иметь и другой метод для установки следующего обработчика в цепочке.
Базовый обработчик — это необязательный класс, в который можно поместить шаблонный код, общий для всех классов обработчиков.
Обычно этот класс определяет поле для хранения ссылки на следующий обработчик. Клиенты могут построить цепочку, передав обработчик конструктору или сеттеру предыдущего обработчика. Класс также может реализовать поведение обработки по умолчанию: он может передать выполнение следующему обработчику после проверки его существования.
Concrete Handlers содержат фактический код для обработки запросов. При получении запроса каждый обработчик должен решить, обрабатывать ли его и, дополнительно, передавать ли по цепочке.
Обработчики обычно автономны и неизменяемы, принимая все необходимые данные только один раз через конструктор.
Клиент может составлять цепочки только один раз или составлять их динамически, в зависимости от логики приложения. Обратите внимание, что запрос может быть отправлен любому обработчику в цепочке — он не обязательно должен быть первым.
В этом примере шаблон Цепочка ответственности отвечает за отображение контекстной справочной информации для активных элементов графического интерфейса.
Классы GUI построены по шаблону Composite. Каждый элемент связан со своим элементом-контейнером. В любой момент вы можете построить цепочку элементов, которая начинается с самого элемента и проходит через все его элементы-контейнеры.
Графический интерфейс приложения обычно имеет структуру дерева объектов. Например, Класс Dialog
, который отображает главное окно приложения, будет корнем дерева объектов. Диалог содержит панелей
, которые могут содержать другие панели или простые низкоуровневые элементы, такие как кнопок
и текстовых полей
.
Простой компонент может отображать краткие контекстные всплывающие подсказки, если компоненту назначен текст справки. Но более сложные компоненты определяют свой собственный способ отображения контекстной справки, например, показ выдержки из руководства или открытие страницы в браузере.
Вот как запрос на помощь проходит через объекты GUI.
Когда пользователь наводит курсор мыши на элемент и нажимает клавишу F1
, приложение обнаруживает компонент под указателем и отправляет ему запрос на помощь. Запрос проходит через все контейнеры элемента, пока не достигнет элемента, способного отображать справочную информацию.
// Интерфейс обработчика объявляет метод для выполнения
// запрос.
Интерфейс ComponentWithContextualHelp
метод showHelp()
// Базовый класс для простых компонентов.
абстрактный класс Компонент реализует ComponentWithContextualHelp
поле tooltipText: строка
// Контейнер компонента действует как следующая ссылка в
// цепочка обработчиков.
Контейнер защищенного поля: Контейнер
// Компонент показывает всплывающую подсказку, если есть текст справки
// присвоено ему. В противном случае вызов перенаправляется на
// контейнер, если он существует.
метод showHelp() есть
если (текст подсказки != ноль)
// Показать всплывающую подсказку.
еще
контейнер.showHelp()
// Контейнеры могут содержать как простые компоненты, так и другие
// контейнеры как дочерние элементы. Цепные отношения
// установлено здесь. Класс наследует поведение showHelp от
// его родитель.
абстрактный класс Контейнер расширяет компонент
дочерние элементы защищенного поля: массив компонентов
метод add(child) есть
дети.добавить(ребенок)
ребенок.контейнер = это
// Примитивные компоненты могут работать со справкой по умолчанию
// выполнение...
Класс Кнопка расширяет Компонент
// ...
// Но сложные компоненты могут переопределить значение по умолчанию
// выполнение. Если текст справки не может быть предоставлен в новом
// таким образом, компонент всегда может вызвать базовую реализацию
// (см. Класс компонента).
класс Panel расширяет контейнер
поле modalHelpText: строка
метод showHelp() есть
если (modalHelpText != ноль)
// Показать модальное окно с текстом справки.
еще
супер.showHelp()
// ...то же, что и выше...
диалоговое окно класса расширяет контейнер
поле wikiPageURL: строка
метод showHelp() есть
если (wikiPageURL != ноль)
// Открытие страницы справки вики.
еще
супер.showHelp()
// Клиентский код.
приложение класса
// Каждое приложение настраивает цепочку по-своему.
метод createUI() есть
диалог = новый диалог ("Бюджетные отчеты")
dialog.wikiPageURL = "http://..."
панель = новая панель (0, 0, 400, 800)
panel.modalHelpText = "Эта панель делает..."
ок = новая кнопка (250, 760, 50, 20, "ОК")
ok.tooltipText = "Это кнопка OK, которая..."
отмена = новая кнопка (320, 760, 50, 20, "Отмена")
// ...
панель.добавить(ок)
панель.добавить(отмена)
диалог.добавить(панель)
// Представьте, что здесь происходит.
метод onF1KeyPress() есть
компонент = this.getComponentAtMouseCoords()
компонент. showHelp()
ПрименимостьИспользуйте шаблон цепочки ответственности, когда предполагается, что ваша программа будет обрабатывать различные типы запросов различными способами, но точные типы запросов и их последовательность заранее неизвестны.
Паттерн позволяет связать несколько обработчиков в одну цепочку и, получив запрос, «спросить» у каждого обработчика, может ли он его обработать. Таким образом, все обработчики получают возможность обработать запрос.
Используйте шаблон, когда необходимо выполнить несколько обработчиков в определенном порядке.
Поскольку вы можете связывать обработчики в цепочке в любом порядке, все запросы будут проходить через цепочку именно так, как вы планировали.
Используйте шаблон CoR, когда предполагается изменение набора обработчиков и их порядка во время выполнения.
Если вы предоставляете сеттеры для ссылочного поля внутри классов обработчиков, вы сможете динамически вставлять, удалять или изменять порядок обработчиков.
Как реализоватьОбъявить интерфейс обработчика и описать сигнатуру метода для обработки запросов.
Решите, как клиент будет передавать данные запроса в метод. Самый гибкий способ — преобразовать запрос в объект и передать его методу обработки в качестве аргумента.
Чтобы устранить повторяющийся шаблонный код в конкретных обработчиках, возможно, стоит создать абстрактный базовый класс обработчика, производный от интерфейса обработчика.
Этот класс должен иметь поле для хранения ссылки на следующий обработчик в цепочке. Подумайте о том, чтобы сделать класс неизменяемым. Однако, если вы планируете изменять цепочки во время выполнения, вам необходимо определить установщик для изменения значения поля ссылки.
Вы также можете реализовать удобное поведение по умолчанию для метода обработки, которое заключается в перенаправлении запроса к следующему объекту, если не осталось ни одного. Конкретные обработчики смогут использовать это поведение, вызвав родительский метод.
Один за другим создайте конкретные подклассы обработчиков и реализуйте их методы обработки. Каждый обработчик должен принять два решения при получении запроса:
- Будет ли обрабатываться запрос.
- Будет ли передаваться запрос по цепочке.
Клиент может либо собирать цепочки самостоятельно, либо получать готовые цепочки от других объектов. В последнем случае необходимо реализовать некоторые фабричные классы для построения цепочек в соответствии с настройками конфигурации или среды.
Клиент может вызвать любой обработчик в цепочке, а не только первый. Запрос будет передаваться по цепочке до тех пор, пока какой-либо обработчик не откажется передавать его дальше или пока он не достигнет конца цепочки.
Из-за динамического характера цепочки клиент должен быть готов к следующим сценариям:
- Цепь может состоять из одного звена.
- Некоторые запросы могут не достигать конца цепочки.
- Другие могут достичь конца цепочки без обработки.
- Вы можете управлять порядком обработки запросов.
- Принцип единой ответственности . Вы можете отделить классы, которые вызывают операции от классов, которые выполняют операции.
- Открытый/Закрытый принцип . Вы можете добавлять в приложение новые обработчики, не нарушая существующий клиентский код.
- Некоторые запросы могут остаться необработанными.
Chain of Responsibility, Command, Mediator и Observer обращаются к различным способам соединения отправителей и получателей запросов:
- Цепочка ответственности передает запрос последовательно по динамической цепочке потенциальных получателей, пока один из них не обработает его.
- Команда устанавливает однонаправленные соединения между отправителями и получателями.
- Посредник устраняет прямые соединения между отправителями и получателями, заставляя их взаимодействовать косвенно через объект-посредник.
- Observer позволяет получателям динамически подписываться и отменять подписку на получение запросов.
Chain of Responsibility часто используется в сочетании с Composite. В этом случае, когда листовой компонент получает запрос, он может передать его по цепочке всех родительских компонентов до корня дерева объектов.
Обработчики в цепочке ответственности могут быть реализованы как команды. В этом случае вы можете выполнять множество различных операций над одним и тем же объектом контекста, представленным запросом.
Однако есть и другой подход, когда сам запрос представляет собой Команда объект. В этом случае вы можете выполнять одну и ту же операцию в ряде различных контекстов, связанных в цепочку.
Chain of Responsibility и Decorator имеют очень похожую структуру классов. Оба шаблона полагаются на рекурсивную композицию, чтобы передать выполнение через ряд объектов. Однако есть несколько принципиальных отличий.
Обработчики CoR могут выполнять произвольные операции независимо друг от друга. Они также могут прекратить передачу запроса дальше в любой момент. С другой стороны, различные Декораторы могут расширять поведение объекта, сохраняя при этом его соответствие базовому интерфейсу. Кроме того, декораторы не могут нарушать поток запроса.
Стратегия
/ Шаблоны проектирования / Модели поведения
НамерениеСтратегия — это шаблон поведенческого проектирования, который позволяет определить семейство алгоритмов, поместить каждый из них в отдельный класс и сделать их объекты взаимозаменяемыми.
ПроблемаОднажды вы решили создать навигационное приложение для случайных путешественников. В основе приложения лежала красивая карта, которая помогала пользователям быстро ориентироваться в любом городе.
Одной из самых востребованных функций приложения было автоматическое планирование маршрута. Пользователь должен иметь возможность ввести адрес и увидеть на карте самый быстрый маршрут к этому пункту назначения.
Первая версия приложения могла строить маршруты только по дорогам. Люди, которые путешествовали на машине, распирали от радости. Но, видимо, не всем нравится водить машину в отпуске. Итак, в следующем обновлении вы добавили возможность строить пешеходные маршруты. Сразу после этого вы добавили еще одну опцию, позволяющую людям пользоваться общественным транспортом на своих маршрутах.
Однако это было только начало. Позже вы планировали добавить построение маршрута для велосипедистов. А еще позже — еще один вариант построения маршрутов по всем достопримечательностям города.
Код навигатора раздулся.
Хотя с точки зрения бизнеса приложение было успешным, техническая часть вызвала у вас много головной боли. Каждый раз, когда вы добавляли новый алгоритм маршрутизации, основной класс навигатора увеличивался вдвое. В какой-то момент зверя стало слишком сложно поддерживать.
Любое изменение в одном из алгоритмов, будь то простое исправление ошибки или небольшая корректировка уличного счета, влияло на весь класс, увеличивая вероятность создания ошибки в уже работающем коде.
Кроме того, командная работа стала неэффективной. Ваши товарищи по команде, которых наняли сразу после успешного релиза, жалуются, что тратят слишком много времени на разрешение конфликтов слияния. Реализация новой функции требует от вас изменения того же самого огромного класса, конфликтующего с кодом, созданным другими людьми.
РешениеШаблон «Стратегия» предполагает, что вы берете класс, который делает что-то конкретное множеством различных способов, и выделяете все эти алгоритмы в отдельные классы с именем 9. 0051 стратегии .
Исходный класс с именем context должен иметь поле для хранения ссылки на одну из стратегий. Контекст делегирует работу связанному объекту стратегии вместо того, чтобы выполнять его самостоятельно.
Контекст не отвечает за выбор подходящего алгоритма для задания. Вместо этого клиент передает желаемую стратегию контексту. На самом деле контекст мало что знает о стратегиях. Он работает со всеми стратегиями через один и тот же общий интерфейс, который предоставляет только один метод запуска алгоритма, инкапсулированного в выбранной стратегии.
Таким образом, контекст становится независимым от конкретных стратегий, поэтому вы можете добавлять новые алгоритмы или модифицировать существующие без изменения кода контекста или других стратегий.
Стратегии планирования маршрута.
В нашем навигационном приложении каждый алгоритм маршрутизации можно выделить в отдельный класс с помощью одного метода buildRoute
. Метод принимает исходную и конечную точки и возвращает набор контрольных точек маршрута.
Несмотря на то, что при одних и тех же аргументах каждый класс маршрутизации может построить свой маршрут, основному классу навигатора все равно, какой алгоритм выбран, поскольку его основной задачей является отображение набора контрольных точек на карте. У класса есть метод для переключения активной стратегии маршрутизации, поэтому его клиенты, такие как кнопки в пользовательском интерфейсе, могут заменить текущее выбранное поведение маршрутизации другим.
Аналогия из реального мираРазличные способы добраться до аэропорта.
Представьте, что вам нужно добраться до аэропорта. Вы можете сесть на автобус, заказать такси или сесть на велосипед. Это ваши транспортные стратегии. Вы можете выбрать одну из стратегий в зависимости от таких факторов, как бюджет или временные ограничения.
СтруктураКонтекст поддерживает ссылку на одну из конкретных стратегий и связывается с этим объектом только через интерфейс стратегии.
Интерфейс Strategy является общим для всех конкретных стратегий. Он объявляет метод, который контекст использует для выполнения стратегии.
Конкретные стратегии реализуют различные варианты алгоритма, который использует контекст.
Контекст вызывает метод выполнения для связанного объекта стратегии каждый раз, когда ему необходимо запустить алгоритм. Контекст не знает, с какой стратегией он работает или как выполняется алгоритм.
Клиент создает определенный объект стратегии и передает его контексту. Контекст предоставляет установщик, который позволяет клиентам заменить стратегию, связанную с контекстом, во время выполнения.
В этом примере контекст использует несколько стратегий для выполнения различных арифметических операций.
// В интерфейсе стратегии объявлены общие для всех операции
// поддерживаемые версии некоторого алгоритма. Контекст использует это
// интерфейс для вызова алгоритма, определенного конкретным
// стратегии.
Интерфейс Стратегия
метод выполнить (а, б)
// Конкретные стратегии реализуют алгоритм при следовании
// интерфейс базовой стратегии. Интерфейс делает их
// взаимозаменяемы в контексте.
класс ConcreteStrategyAdd реализует стратегию
метод execute(a, b) есть
вернуть а + б
класс ConcreteStrategySubtract реализует стратегию
метод execute(a, b) есть
вернуть а - б
класс ConcreteStrategyMultiply реализует стратегию
метод execute(a, b) есть
вернуть а * б
// Контекст определяет интересующий клиентов интерфейс.
Контекст класса
// Контекст поддерживает ссылку на одну из стратегий
// объекты. Контекст не знает конкретного класса
// стратегия. Он должен работать со всеми стратегиями через
// интерфейс стратегии.
частная стратегия: Стратегия
// Обычно контекст принимает стратегию через
// конструктор, а также предоставляет сеттер, чтобы
// стратегию можно переключать во время выполнения.
метод setStrategy (Стратегия стратегии)
this.strategy = стратегия
// Контекст делегирует часть работы объекту стратегии
// вместо реализации нескольких версий
// алгоритм сам по себе.
метод executeStrategy(int a, int b)
возврат Strategy.execute(a, b)
// Клиентский код выбирает конкретную стратегию и передает ее в
// контекст. Клиент должен знать об отличиях
// между стратегиями, чтобы сделать правильный выбор.
класс ExampleApplication
метод main() есть
Создать объект контекста.
Прочитайте первое число.
Прочтите последнюю цифру.
Прочитайте желаемое действие из пользовательского ввода.
если (действие == сложение), то
context.setStrategy(новый ConcreteStrategyAdd())
если (действие == вычитание), то
context.setStrategy (новый ConcreteStrategySubtract())
если (действие == умножение), то
context.setStrategy (новый ConcreteStrategyMultiply())
результат = context. executeStrategy (первое число, второе число)
Распечатать результат.
ПрименимостьИспользуйте шаблон Стратегия, если вы хотите использовать различные варианты алгоритма внутри объекта и иметь возможность переключаться с одного алгоритма на другой во время выполнения.
Шаблон «Стратегия» позволяет вам косвенно изменять поведение объекта во время выполнения, связывая его с различными подобъектами, которые могут выполнять определенные подзадачи разными способами.
Используйте Стратегию, когда у вас есть много похожих классов, которые отличаются только тем, как они выполняют некоторое поведение.
Шаблон Стратегия позволяет выделить различное поведение в отдельную иерархию классов и объединить исходные классы в один, тем самым уменьшив дублирование кода.
Используйте шаблон, чтобы изолировать бизнес-логику класса от деталей реализации алгоритмов, которые могут быть не такими важными в контексте этой логики.
Шаблон Strategy позволяет изолировать код, внутренние данные и зависимости различных алгоритмов от остального кода. Различные клиенты получают простой интерфейс для выполнения алгоритмов и переключения их во время выполнения.
Используйте шаблон, если в вашем классе есть массивный условный оператор, который переключается между различными вариантами одного и того же алгоритма.
Шаблон Стратегия позволяет отказаться от такого условного выражения, выделяя все алгоритмы в отдельные классы, реализующие один и тот же интерфейс. Исходный объект делегирует выполнение одному из этих объектов вместо реализации всех вариантов алгоритма.
Как реализоватьВ классе контекста определите алгоритм, который подвержен частым изменениям. Это также может быть массивное условное выражение, которое выбирает и выполняет вариант одного и того же алгоритма во время выполнения.
Объявить интерфейс стратегии общим для всех вариантов алгоритма.
Один за другим извлеките все алгоритмы в их собственные классы. Все они должны реализовать интерфейс стратегии.
В классе контекста добавить поле для хранения ссылки на объект стратегии. Предоставьте сеттер для замены значений этого поля. Контекст должен работать с объектом стратегии только через интерфейс стратегии. Контекст может определять интерфейс, который позволяет стратегии получать доступ к своим данным.
Клиенты контекста должны связать его с подходящей стратегией, которая соответствует тому, как они ожидают, что контекст будет выполнять свою основную работу.
- Вы можете поменять местами алгоритмы, используемые внутри объекта во время выполнения.
- Вы можете изолировать детали реализации алгоритма от кода, который его использует.
- Вы можете заменить наследование композицией.
- Принцип открытия/закрытия . Вы можете внедрять новые стратегии, не меняя контекст.
- Если у вас всего пара алгоритмов и они редко меняются, нет никакой реальной причины усложнять программу новыми классами и интерфейсами, которые поставляются вместе с шаблоном.
- Клиенты должны знать о различиях между стратегиями, чтобы иметь возможность выбрать правильную.
- Многие современные языки программирования поддерживают функциональные типы, что позволяет реализовывать различные версии алгоритма внутри набора анонимных функций. Затем вы могли бы использовать эти функции точно так же, как вы использовали бы объекты стратегии, но без раздувания кода дополнительными классами и интерфейсами.
Мост, Состояние, Стратегия (и в некоторой степени Адаптер) имеют очень похожую структуру. Действительно, все эти шаблоны основаны на композиции, которая делегирует работу другим объектам. Однако все они решают разные задачи. Шаблон — это не просто рецепт структурирования вашего кода определенным образом. Он также может сообщить другим разработчикам о проблеме, которую решает шаблон.
Command и Strategy могут выглядеть одинаково, потому что вы можете использовать их для параметризации объекта с помощью некоторого действия. Однако у них очень разные намерения.
Вы можете использовать команду для преобразования любой операции в объект. Параметры операции становятся полями этого объекта. Преобразование позволяет отложить выполнение операции, поставить ее в очередь, сохранить историю команд, отправить команды в удаленные службы и т. д.
С другой стороны, Стратегия обычно описывает разные способы выполнения одних и тех же действий, позволяя вам менять местами эти алгоритмы в рамках одного контекстного класса.
Decorator позволяет изменить внешний вид объекта, а Strategy позволяет изменить его внутреннюю часть.
- Шаблонный метод
основан на наследовании: он позволяет вам изменять части алгоритма, расширяя эти части в подклассах. Стратегия основана на композиции: вы можете изменять части поведения объекта, снабжая его различными стратегиями, соответствующими этому поведению. Метод шаблона работает на уровне класса, поэтому он статичен. Стратегия работает на уровне объекта, позволяя переключать поведение во время выполнения.
Состояние можно рассматривать как расширение Стратегии. Оба шаблона основаны на композиции: они изменяют поведение контекста, делегируя часть работы вспомогательным объектам. Стратегия делает эти объекты полностью независимыми и не знающими друг друга. Однако State не ограничивает зависимости между конкретными состояниями, позволяя им изменять состояние контекста по желанию.