Шаблоны поведения человека и их формирование – почему некоторые мешают жить
В жизни ты постоянно действуешь по шаблону, сама того не замечая. Иногда это приводит тебя к желаемому результату, но чаше всего ты оказываешься в замкнутом круге проблем, которые с каждым разом все усугубляются. Что такое шаблонное поведение? Как оно появляется? Как влияет на твою жизнь? И можно ли выбраться из замкнутого круга?
В этой статье:
Что такое шаблоны в поведенииОткуда берутся поведенческие шаблоныПочему так трудно избавиться от шаблоновВлияние шаблонов на жизньКак избавиться от шаблонного поведенияКак шаблоны (не) меняют нас к лучшему
Новости СМИ2
Что такое шаблоны в поведении
Фото автора Yaroslava Borz: Pexels
Шаблонное поведение – это неосознаваемая модель действия, которую человек использует, оказавшись в определенной ситуации.
Шаблоны в жизни человека очень разнообразны, часто выделяют:
- шаблоны мышления – когда человек использует одни и те же мысленные модели. Например, идя на собеседование, девушка может по привычке думать: «зачем я поехала, меня все равно не возьмут на работу».
- речевые шаблоны – привычка изъясняться одинаковыми фразами, использование типичных оборотов речи, слов-паразитов;
- шаблоны восприятия – свойство психики замечать и преувеличивать значимость одной информации, и игнорировать другую информацию, которая не вписывается в привычную модель восприятия. Например, глядя на свое отражение, девушка может преувеличивать количество морщин, недостатки фигуры, короткие ресницы, но не замечать красивые глаза, тонкую талию и длинные ноги;
- шаблоны эмоциональных реакций – у человека есть «излюбленные» эмоции, которыми он реагирует на определенную ситуацию. Например, оказавшись в пробке, один человек чаще всего злится, другой обижается на жену, которая медленно собиралась, третий смеется, что опять «начальник его убьет»;
- шаблонные повседневные действия – когда ты ездишь на работу одним и тем же маршрутом, выбираешь одни и те же места в общественном транспорте, покупаешь кофе в одной и той же кофейне;
- шаблоны на уровне жизненных сценариев – в каких людей влюбляться, какую профессию выбирать, как относиться к деньгам, к воспитанию детей.
Это шаблоны, которые определяют образ жизни.
Поведенческие шаблоны всегда возникают в одной и той же ситуации, они стереотипны, одинаковы и приводят к одному результату. При этом человек, как правило, не замечает, что действует по шаблону.
Откуда берутся поведенческие шаблоны
Большинство шаблонов появляются у человека в детстве: вследствие воспитания, родительских установок, путем подражания взрослым, социального научения, общественных норм поведения. Поскольку у ребенка еще не сформировано критическое мышление, ему не свойственна избирательность. Он не может оценить, подходит ему тот или иной шаблон или нет, поэтому «берет» все, что получает. Но и во взрослом возрасте такое происходит.
Механизм выработки шаблона достаточно прост. Оказавшись в какой-то ситуации, человек на нее реагирует, то есть предпринимает какие-либо действия. Если они возымели должный эффект, он получает положительное подкрепление этой модели поведения. Мозг воспринимает ее как конструктивную и «рабочую», запоминает. Потом, оказавшись в аналогичной ситуации, активизируется уже сформированная нейронная сеть – человек поступает точно также, как и в прошлый раз.
Например, твой муж поздно пришел с работы. Ты обиделась на него. Это вызвало у него желание искупить свою вину, он извинился и подарил цветы. Ты почувствовала удовлетворение. А мозг поставил «галочку» – модель поведения сработала.
Психология простыми словами: паттерн поведения
В следующий раз, если муж опаздывает, у тебя снова возникает чувство обиды. Реакция мужа повторяется. Проблема в том, что это превращается в замкнутый круг. Муж все больше задерживается на работе, потому что устает от постоянно обиженной жены, на что она все больше обижается.
Почему так трудно избавиться от шаблонов
Шаблоны помогают избегать чувства тревоги, которое возникает от неопределенности. Они говорят: «не надо паники, мы знаем, что с этим делать». Это помогает человеку оставаться в зоне психологического комфорта. Мозг стремиться к тому, чтобы минимизировать затраты ресурсов, поэтому не считает нужным тратить энергию на разбор ситуации, когда уже есть готовый ответ, то есть шаблон поведения в этой ситуации.
Они значительно упрощают жизнь, позволяя делать многие вещи и принимать решения автоматически, не тратя время и силы на лишние усилия. Так, пока ты едешь на работу по привычному маршруту, ты о нем не задумываешься и можешь в это время читать книгу, листать ленту, думать о работе и так далее.
Влияние шаблонов на жизнь
Многие шаблоны бывают положительными, они облегчают жизнь. Но проблема в том, что ты не осознаешь, какие именно у тебя шаблоны. И не замечаешь тех, которые делают жизнь хуже. Обычно они настолько глубоко «вшиты» в человека, что можно не заметить, какое сильное негативное влияние они оказывают на его жизнь.
Особенно это касается родительских шаблонов:
- когда женщина постоянно выбирает мужчин абьюзеров, потому что переняла шаблонную модель матери;
- когда остается на нелюбимой работе, потому что есть родительская установка, что в их семье все юристы;
- когда испытывает страх перед начальством и все время молчит, потому что «не шуми, когда взрослые разговаривают»;
- когда кричит на своего ребенка и всегда его контролирует, поскольку также воспитывали и ее;
- когда не может выйти на желаемый уровень дохода, потому что «не женское это дело» или «всех денег все равно не заработаешь»;
- когда не может найти мужа, потому что «мужчинам доверять нельзя, они всегда уходят из семьи».
Шаблонное поведение может приносить пользу, но часто бывает деструктивным, поскольку каждая ситуация уникальна. Порой она требует творческого решения, инициативы. Поступая «по привычке», ты теряешь такую возможность, не видишь более продуктивные варианты, не замечаешь очевидного.
Как избавиться от шаблонного поведения
Выйти из замкнутого круга собственных шаблонов бывает достаточно трудно, особенно, если они уже давно укоренились в сознании, но это возможно. Для этого нужно осознать свои шаблоны – это серьезная работа по самоанализу:
- обрати внимание на стереотипные ситуации, с которыми ты постоянно сталкиваешься;
- проанализируй свое поведение в них и эмоциональные реакции. Ты заметишь, что поступаешь примерно одинаково;
- подумай, как часто эта модель поведения приводила к желаемому результату;
- найди причину такого поведения – когда ты «подцепила» этот шаблон, при каких обстоятельствах, на чьей пример ты опиралась, кому подражала;
- вернись к стереотипной ситуации и придумай как еще можно на нее отреагировать, как вырваться из замкнутого круга, какие нестандартные выходы можно найти;
- снова столкнувшись с этой ситуацией, вспомни, что она триггер для шаблонного поведения;
- откажись от шаблона и сделай что-то по-другому.
Чем больше в твоей жизни будет осознанности, чем больше ты «выловишь» шаблонов, тем лучше будет качество жизни. Ты обретешь гармонию со своими потребностями, наладишь отношения с близкими, улучшишь материальное положение и перестанешь жить по однотипному сценарию.
Как шаблоны (не) меняют нас к лучшему
Мышление шаблонами и как избавиться от стереотипных установок
Развитие шаблонного мышления связано не только с воспитанием. Значение имеет и наш собственный жизненный опыт, который мы получаем. И чем дольше мы живем, тем больше рамок появляются вокруг нас.
Например, ребенку с детства внушают мысль о том, что овощи – это хорошо, а шоколад – плохо. Ребенок же делает вид, что соглашается с родителем (с другой стороны – а какой у него есть выбор?). Но, уже в сознательном возрасте, часто меняет свое отношение, а результатом проблема с пищевым поведением на фоне постоянных запретов.
Возможность выходить из рамок стереотипного мышления и изменять его на рациональное есть. Главное сознательно увидеть в себе то самое стереотипное мышление.
Начните анализировать свою реакцию на то или иное событие. Вы считаете, что юная девушка не может встречаться со взрослым мужчиной и чувствовать к нему нечто большее, чем просто интерес к его деньгам?
Вам начинает казаться, что ваш коллега выбрал слишком сложный вариант решения задачи, которую все делают «по-старинке», и вас это раздражает? С большой долей вероятности ваш диагноз – шаблонность.
Выбирать стереотипный образ мышления, который сможет подсказать нам, что думать и что именно говорить в той или иной ситуации, позволяет нам приходить к определенному уровню комфорта. Гораздо легче придерживаться конкретного убеждения, нежели мыслить самостоятельно.
Женщины часто вынуждены подстраиваться по общество, которое всегда лучше знает, как им жить и что делать. Изменять уже готовый сценарий своей жизни способны далеко не все. Однако если вы все же сделали выбор в пользу нешаблонного мышления, то будьте готовы заранее, что разрывать стереотипы бывает довольно неприятно.
Если выражаться ещё проще – вас будут осуждать за ваше решение.
Что насчет правил этикета?
Стереотипы присутствуют в каждой сфере нашей деятельности. И тем более там, где дело доходит до общения между людьми. Этикет завязан на шаблонном поведении.
Под шаблонным поведением в рамках этикета понимают то, что для каждой ситуации, в которую мы попадаем, существует определенный тип модели поведения. Каждая модель включает в себя некоторый набор действий, который помогает людям вести себя должным образом и реагировать на то, что с ними происходит.
Например, рукопожатие у мужчин при встрече. Данный привычный жест большинство используют уже автоматически, не начиная при этом задумываться. Рука сама бессознательно тянется вперед. Так действовать мы начинаем из-за того, что развивается автоматизм.
Теперь в каждом похожем моменте, в котором мы будем оказываться, для нас будет существовать определенная норма и последовательность действий, которая просто обязана использоваться.
В некотором роде привычка также относится к шаблонному поведению. Только её мы будем создавать уже сами для себя. Сюда относится, например, кофе с утра. Сначала мы легко позволяем себе чашечку с утра, затем это будет повторяться ещё раз и ещё.
Из этого начинает складываться определенная установка, и вот мы уже постепенно будем замечать, что чашка кофе становится обязательным способом начать новый день.
Пример стереотипов из сериалов
Сериалы, которые мы смотрим после работы, нередко формируют у нас в голове шаблонную картину мира. Стереотип из сериала действует в том числе и на нашу личность. Постепенно начинает появляться желание выглядеть и быть другим человеком, становиться похожим на любимого героя.
Рассмотрим не самые лучшие стереотипы о женщинах в сериалах, которые там до сих пор продолжают активно представлять:
- Смена стиля и прически обозначает новую жизнь: да, иногда, смена стиля действительно символизирует важный переход, но это лишь один из многих вариантов того, как изменить свою жизнь (при этом далеко не самый главный):
- От возраста зависит красота: сколько раз вы наблюдали в сериале распри между молодой и привлекательной любовницей и старой некрасивой женой? Вопрос почти что риторический;
- Карьеру и работу выбирают только стервы;
- Красота должна помещаться в установленные рамки: да, да, речь снова о комплексах и стройных фигурах;
- Все, чего может хотеть женщина, это брак.
Что такое паттерн
Паттерном называют некую схему или образец, которая повторяется с определенной закономерностью. Это целая система в мозгу индивида, которая влияет на наши поведенческие реакции.
Данный термин могут использовать как в сфере психологии, так и в области дизайна или айти. Много шаблонных действий и фраз могут применять, например, в области дизайна и рекламы. Использование паттернов нередко можно обнаружить на сайте компании, в презентации, продающем тексте или даже в статье.
Практически всегда это конкретный штамп, призванный зацепить наше внимание. Их количество определяет качество и сам процесс восприятия. Однако даже в шаблонах важен некоторый творческий подход, иначе мы начнем видеть их слишком явно и эффект исчезнет.
Шаблоном нередко могут пользоваться для того, чтобы у клиента начинал формироваться хороший (нужный) образ того или иного товара или услуги.
Как работает рациональность
Термин «рациональность» означает осознанность, при которой восприятие нами какого-либо объекта или обстоятельства осуществляется только на основании основной полученной нами информации.
К рациональному мышление относится и такое понятие как «осознанный взгляд». При этом человек фокусируется на своем внутреннем состоянии в текущий момент времени. Любое событие, которые будет с ним происходить, он оценивает, руководствуясь не заложенным шаблоном, а собственным умом.
Однако излишнее стремление к осознанности способно разрушить наши психологические защитные механизмы. Отказываться от шаблонной деятельности действительно сложно, находить собственный путь и идти по нему – ещё сложнее.
5 шаблонов поведения, которые вредят отношениям
25 830
Мужчина и женщинаКризис отношенийПрактики how to
Многие приходят в отношения с определенными ожиданиями, установками и сценариями поведения, которые задают изначально неверное направление развития событий. В итоге мы с удивлением получаем неудовлетворительный результат. Чтобы избежать такого развития событий, необходимо определить, какие отношения нам подходят, и задуматься, ведут ли наши текущие действия к этой цели.
Типы поведения, которые мешают гармоничному развитию отношений
1. Брать на себя роль родителя по отношению к партнеру
Если у вас порой возникает желание усиленно заботиться о партнере — поучать, контролировать, делать что-то за него, в вас просыпается мать. Возможно, партнер провоцирует вас на эту роль, выбирая для себя роль ребенка.
Скорее всего, вы привыкли многое взваливать на свои плечи: решать проблемы окружающих, давать им напутствия. Опасность такого поведения по отношению к партнеру заключается в том, что, однажды примерив на себя роль родителя и закрепившись в ней, вам будет сложно что-либо изменить.
С течением времени партнер будет становиться все более беспомощным, перекладывая груз ответственности на вас
А вы, в свою очередь, будете чувствовать себя еще более загнанными и несчастными под бременем гнетущих проблем и нескончаемого списка задач. Если это не то, к чему вы хотите прийти в итоге, то лучше заранее останавливать себя в проявлении гиперзаботы и опеки.
2. Приходить в отношения из позиции «ребенок»
Когда вы ищете отношений из страха, что без них ваша жизнь неполная, не справляетесь сами с жизненными задачами и ищете того, кто мог бы вас от этого всего избавить, это показатель того, что вы оказались в детской позиции. Вы будто заново переживаете состояние сильной зависимости от другого, которое испытывали детстве: «без тебя я не справляюсь».
Хотя в таком положении есть и выгодная сторона: не нужно брать на себя ответственность, ведь у ребенка ее нет. И значит, не нужно потом отвечать за последствия принятых решений, злиться на себя. Вместо этого можно сказать: «Это ты виноват, ты мне сказал, чтобы я…»
Сложность в том, что, соглашаясь на роль ребенка, придется терпеть критику, находиться в зависимости от «взрослого», забывать себя
Вспомните детство, когда нужно было подстраиваться под родителя, быть хорошей девочкой, угадывать настроение… В результате не оставалось места для ваших эмоций, того, чтобы заглянуть в себя, прислушаться к себе: «а как мне там внутри?»
У ребенка нет другого выхода, так как он не выживет без взрослого, а вот взрослый человек вполне способен жить самостоятельно. Иногда люди эмоционально застревают в каком-то возрасте и так и остаются маленькими девочками и мальчиками. Они все время будут встречать одни и те же ситуации, которые будут их стимулировать расти дальше.
Когда с вами в очередной раз случается неприятность, с которой не хочется разбираться, спросите себя, зачем она возникла в вашей жизни. Скорее всего, в ней заключается задача вашего развития. Отказываясь разбираться с этой ситуацией, вы просто откладываете ее на потом. В итоге возникнет новая ситуация, которая хоть и будет отличаться по некоторым характеристикам, но все же будет нести в себе тот же смысл — дать вам возможность повзрослеть и взять ответственность за свою жизнь.
3. Приходить в отношения с ожиданиями
Когда вы уверены, что мужчина должен вести себя определенным образом, действовать именно так, как вы представляете, и никак иначе, вы готовите почву для частых разочарований. Ожидания никогда не ведут ни к чему хорошему.
Конечно, нужно иметь представление о том, какие качества, характеристики и действия мужчины вам подходят, но не стоит стараться вложить в этот образ реального человека. Он такой, какой есть. Лучше запастись интересом и, возможно, терпением, чтобы начать узнавать его.
Когда вы постоянно сравниваете его с идеалом и пытаетесь переделать, это ничем хорошим не заканчивается
В какой-то момент нужно понять, готовы ли вы продолжать его узнавать или он слишком вам не подходит и это слишком ранит, чтобы идти дальше? И принять соответствующее решение: «да, я еще посмотрю», «нет, я больше не хочу продолжать».
Никто не заставляет вас оставаться там, где вам некомфортно, с тем, с кем вам некомфортно. Если же вы чувствуете дискомфорт, но остаетесь, то следует обратиться к психологу, чтобы разобраться в этой ситуации, пока у вас нет ресурсов изменить ее самостоятельно.
Если вы снова и снова уходите из отношений, это тоже своеобразный маячок: что для вас каждый раз столь невыносимо? Как вы находите, выбираете именно таких мужчин? Что их объединяет? В этом случае тоже, вероятно, лучше обратиться к психологу, чтобы лучше понять, что на вас влияет.
4. Зацикливаться на негативных моментах
Все люди состоят из достоинств и недостатков, и в любых отношениях есть и хорошие, и плохие периоды и моменты. При этом важно, на чем вы фокусируетесь, что чаще замечаете — плохое или хорошее?
Есть люди, которые зацикливаются только на плохих моментах, когда на самом деле во всем разнообразии жизни можно отыскать и множество хорошего
Примером такой фиксации может быть следующая позиция: «В своей жизни я следую правилу: если в отношениях 95% меня радуют, но есть хотя бы 5%, которые мне не нравятся, я направляю все свое внимание на эти 5%, чтобы изменить ситуацию».
Что в таком случае получает партнер? Постоянные претензии, критику и замечания, в результате раздражение между партнерами усиливается, атмосфера в отношениях накаляется, это приближает пару к разрыву.
5. Считать, что партнер во всем должен подстраиваться под вас
Отношения между двумя людьми строятся на постоянном взаимодействии, сонастройке и поиске «золотой середины». Очень часто здесь приводят метафору моста, который строят два человека, чтобы встретиться посередине.
Иногда мы уступаем партнеру, а иногда он уступает нам, но это не должно быть игрой в одни ворота. Обычно позиция «Я хочу, чтобы все было по-моему» эгоцентрична и неуважительна по отношению к другому, ведь она его не учитывает: каково ему при этом, удобно ли? Отношения как союз двух личностей не могут ориентироваться на потребности и желания только одной из них — у таких отношений просто нет пути для развития.
Метафорические ассоциативные карты с вопросами «Осознанность»
Метафорические ассоциативные карты позволят понять свои чувства и глубинные убеждения, которые в том числе вредят отношениям с партнером.
Реклама. ООО «Яндекс»
Сертифицированный гештальт-терапевт, член Европейской ассоциации гештальт-терапии (EAGT).
Личный сайт
Текст:Редакция PSYCHOLOGIES.
Новое на сайте
«Сожалею, что не родила ребенка. Можно ли быть бездетной и счастливой?»
Каково это — быть мазохистом: откровения хозяйки секретного места встреч
Как сохранять любовь: главный секрет счастья
«Девушка с прицепами», или как я вышла замуж с тремя детьми
Тест: Чем вы нравитесь окружающим?
«Мужчина сказал, что уйдет от меня, если я не помирю его с любовницей»
Как помочь людям с аутизмом в период стресса и изменений
«При ближайшем рассмотрении оба оказались упырями»: история России глазами нечисти
Цепочка ответственности
/ Шаблоны проектирования / Модели поведения
Также известен как: CoR, Chain of Command
НамерениеЦепочка ответственности — это поведенческий шаблон проектирования, позволяющий передавать запросы по цепочке обработчиков. Получив запрос, каждый обработчик решает либо обработать запрос, либо передать его следующему обработчику в цепочке.
ПроблемаПредставьте, что вы работаете над системой онлайн-заказов. Вы хотите ограничить доступ к системе, чтобы только авторизованные пользователи могли создавать заказы. Кроме того, пользователи с правами администратора должны иметь полный доступ ко всем заказам.
После небольшого планирования вы поняли, что эти проверки должны выполняться последовательно. Приложение может попытаться аутентифицировать пользователя в системе всякий раз, когда оно получает запрос, содержащий учетные данные пользователя. Однако, если эти учетные данные неверны и аутентификация не удалась, нет причин продолжать какие-либо другие проверки.
Запрос должен пройти ряд проверок, прежде чем система заказов сможет его обработать.
В течение следующих нескольких месяцев вы реализовали еще несколько таких последовательных проверок.
Один из ваших коллег предположил, что передавать необработанные данные прямо в систему заказов небезопасно. Итак, вы добавили дополнительный шаг проверки для очистки данных в запросе.
Позже кто-то заметил, что система уязвима для взлома паролей методом грубой силы. Чтобы предотвратить это, вы быстро добавили проверку, которая отфильтровывает повторяющиеся неудачные запросы, поступающие с одного и того же IP-адреса.
Кто-то еще предложил ускорить работу системы, возвращая кэшированные результаты при повторных запросах, содержащих одни и те же данные. Следовательно, вы добавили еще одну проверку, которая пропускает запрос в систему, только если нет подходящего кэшированного ответа.
Чем больше код рос, тем запутаннее он становился.
Код чеков, и без того выглядевший кашей, становился все более и более раздутым по мере добавления каждой новой функции. Изменение одного чека иногда влияло на другие. Хуже всего то, что когда вы пытались повторно использовать проверки для защиты других компонентов системы, вам приходилось дублировать часть кода, поскольку эти компоненты требовали некоторых проверок, но не всех.
Система стала очень сложной для понимания и дорогой в обслуживании. Вы какое-то время боролись с кодом, пока однажды не решили провести рефакторинг всего этого.
РешениеКак и многие другие поведенческие шаблоны проектирования, цепочка ответственности полагается на преобразование определенных поведений в автономные объекты, называемые обработчиками . В нашем случае каждая проверка должна быть извлечена в свой класс с помощью одного метода, выполняющего проверку. Запрос вместе со своими данными передается этому методу в качестве аргумента.
Шаблон предлагает связать эти обработчики в цепочку. Каждый связанный обработчик имеет поле для хранения ссылки на следующий обработчик в цепочке. Помимо обработки запроса, обработчики передают запрос дальше по цепочке. Запрос перемещается по цепочке до тех пор, пока все обработчики не получат возможность его обработать.
Вот лучшая часть: обработчик может принять решение не передавать запрос дальше по цепочке и эффективно остановить дальнейшую обработку.
В нашем примере с системами заказов обработчик выполняет обработку, а затем решает, передать ли запрос дальше по цепочке. Предполагая, что запрос содержит правильные данные, все обработчики могут выполнять свое основное поведение, будь то проверка подлинности или кэширование.
Дрессировщики выстраиваются один за другим, образуя цепочку.
Однако есть немного другой подход (и он немного более каноничный), при котором, получив запрос, обработчик решает, может ли он его обработать. Если это возможно, он не передает запрос дальше. Таким образом, либо только один обработчик обрабатывает запрос, либо вообще ничего. Этот подход очень распространен при работе с событиями в стеках элементов в графическом пользовательском интерфейсе.
Например, когда пользователь нажимает кнопку, событие распространяется по цепочке элементов графического интерфейса, которая начинается с кнопки, проходит по ее контейнерам (таким как формы или панели) и заканчивается главным окном приложения. Событие обрабатывается первым элементом в цепочке, способным его обработать. Этот пример также примечателен тем, что он показывает, что цепочку всегда можно извлечь из дерева объектов.
Цепочка может быть сформирована из ветви дерева объектов.
Крайне важно, чтобы все классы обработчиков реализовывали один и тот же интерфейс. Каждый конкретный обработчик должен заботиться только о следующем, имеющем метод execute
. Таким образом, вы можете создавать цепочки во время выполнения, используя различные обработчики, не связывая свой код с их конкретными классами.
Звонок в службу технической поддержки может проходить через нескольких операторов.
Вы только что купили и установили на свой компьютер новое оборудование. Поскольку вы гик, на компьютере установлено несколько операционных систем. Вы пытаетесь загрузить их все, чтобы увидеть, поддерживается ли оборудование. Windows автоматически обнаруживает и включает оборудование. Однако ваш любимый Linux отказывается работать с новым железом. С небольшим проблеском надежды вы решаете позвонить по телефону техподдержки, указанному на коробке.
Первое, что вы слышите, это механический голос автоответчика. Он предлагает девять популярных решений различных проблем, ни одно из которых не имеет отношения к вашему делу. Через некоторое время робот подключает вас к живому оператору.
Увы, ничего конкретного оператор подсказать тоже не может. Он продолжает цитировать длинные выдержки из руководства, отказываясь слушать ваши комментарии. Услышав фразу «вы пробовали выключить и снова включить компьютер?» в 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 позволяет изменить его внутреннюю часть.
- Шаблонный метод
основан на наследовании: он позволяет вам изменять части алгоритма, расширяя эти части в подклассах. Стратегия основана на композиции: вы можете изменять части поведения объекта, снабжая его различными стратегиями, соответствующими этому поведению. Метод шаблона работает на уровне класса, поэтому он статичен.