Цепочка обязанностей
Также известен как: CoR, Chain of Command, Chain of Responsibility
Суть паттерна
Цепочка обязанностей — это поведенческий паттерн проектирования, который позволяет передавать запросы последовательно по цепочке обработчиков. Каждый последующий обработчик решает, может ли он обработать запрос сам и стоит ли передавать запрос дальше по цепи.
ПроблемаПредставьте, что вы делаете систему приёма онлайн-заказов. Вы хотите ограничить к ней доступ так, чтобы только авторизованные пользователи могли создавать заказы. Кроме того, определённые пользователи, владеющие правами администратора, должны иметь полный доступ к заказам.
Вы быстро сообразили, что эти проверки нужно выполнять последовательно. Ведь пользователя можно попытаться «залогинить» в систему, если его запрос содержит логин и пароль. Но если такая попытка не удалась, то проверять расширенные права доступа попросту не имеет смысла.
Запрос проходит ряд проверок перед доступом в систему заказов.
На протяжении следующих нескольких месяцев вам пришлось добавить ещё несколько таких последовательных проверок.
Кто-то резонно заметил, что неплохо бы проверять данные, передаваемые в запросе перед тем, как вносить их в систему — вдруг запрос содержит данные о покупке несуществующих продуктов.
Кто-то предложил блокировать массовые отправки формы с одним и тем же логином, чтобы предотвратить подбор паролей ботами.
Кто-то заметил, что форму заказа неплохо бы доставать из кеша, если она уже была однажды показана.
Со временем код проверок становится всё более запутанным.
С каждой новой «фичей» код проверок, выглядящий как большой клубок условных операторов, всё больше и больше раздувался. При изменении одного правила приходилось трогать код всех проверок. А для того, чтобы применить проверки к другим ресурсам, пришлось продублировать их код в других классах.
Поддерживать такой код стало не только очень хлопотно, но и затратно. И вот в один прекрасный день вы получаете задачу рефакторинга…
РешениеКак и многие другие поведенческие паттерны, Цепочка обязанностей базируется на том, чтобы превратить отдельные поведения в объекты. В нашем случае каждая проверка переедет в отдельный класс с единственным методом выполнения. Данные запроса, над которым происходит проверка, будут передаваться в метод как аргументы.
А теперь по-настоящему важный этап. Паттерн предлагает связать объекты обработчиков в одну цепь. Каждый из них будет иметь ссылку на следующий обработчик в цепи. Таким образом, при получении запроса обработчик сможет не только сам что-то с ним сделать, но и передать обработку следующему объекту в цепочке.
Передавая запросы в первый обработчик цепочки, вы можете быть уверены, что все объекты в цепи смогут его обработать. При этом длина цепочки не имеет никакого значения.
И последний штрих.
В примере с фильтрацией доступа обработчики прерывают дальнейшие проверки, если текущая проверка не прошла. Ведь нет смысла тратить попусту ресурсы, если и так понятно, что с запросом что-то не так.
Обработчики следуют в цепочке один за другим.
Но есть и другой подход, при котором обработчики прерывают цепь только когда они могут обработать запрос. В этом случае запрос движется по цепи, пока не найдётся обработчик, который может его обработать. Очень часто такой подход используется для передачи событий, создаваемых классами графического интерфейса в результате взаимодействия с пользователем.
Например, когда пользователь кликает по кнопке, программа выстраивает цепочку из объекта этой кнопки, всех её родительских элементов и общего окна приложения на конце. Событие клика передаётся по этой цепи до тех пор, пока не найдётся объект, способный его обработать. Этот пример примечателен ещё и тем, что цепочку всегда можно выделить из древовидной структуры объектов, в которую обычно и свёрнуты элементы пользовательского интерфейса.
Цепочку можно выделить даже из дерева объектов.
Очень важно, чтобы все объекты цепочки имели общий интерфейс. Обычно каждому конкретному обработчику достаточно знать только то, что следующий объект в цепи имеет метод
. Благодаря этому связи между объектами цепочки будут более гибкими. Кроме того, вы сможете формировать цепочки на лету из разнообразных объектов, не привязываясь к конкретным классам.
Пример общения с поддержкой.
Вы купили новую видеокарту. Она автоматически определилась и заработала под Windows, но в вашей любимой Ubuntu «завести» её не удалось. Со слабой надеждой вы звоните в службу поддержки.
Первым вы слышите голос автоответчика, предлагающий выбор из десятка стандартных решений. Ни один из вариантов не подходит, и робот соединяет вас с живым оператором.
Увы, но рядовой оператор поддержки умеет общаться только заученными фразами и давать шаблонные ответы. После очередного предложения «выключить и включить компьютер» вы просите связать вас с настоящими инженерами.
Оператор перебрасывает звонок дежурному инженеру, изнывающему от скуки в своей каморке. Уж он-то знает, как вам помочь! Инженер рассказывает вам, где скачать подходящие драйвера и как настроить их под Ubuntu. Запрос удовлетворён. Вы кладёте трубку.
СтруктураОбработчик определяет общий для всех конкретных обработчиков интерфейс. Обычно достаточно описать единственный метод обработки запросов, но иногда здесь может быть объявлен и метод выставления следующего обработчика.
Базовый обработчик — опциональный класс, который позволяет избавиться от дублирования одного и того же кода во всех конкретных обработчиках.
Обычно этот класс имеет поле для хранения ссылки на следующий обработчик в цепочке. Клиент связывает обработчики в цепь, подавая ссылку на следующий обработчик через конструктор или сеттер поля. Также здесь можно реализовать базовый метод обработки, который бы просто перенаправлял запрос следующему обработчику, проверив его наличие.
Конкретные обработчики содержат код обработки запросов. При получении запроса каждый обработчик решает, может ли он обработать запрос, а также стоит ли передать его следующему объекту.
В большинстве случаев обработчики могут работать сами по себе и быть неизменяемыми, получив все нужные детали через параметры конструктора.
Клиент может либо сформировать цепочку обработчиков единожды, либо перестраивать её динамически, в зависимости от логики программы. Клиент может отправлять запросы любому из объектов цепочки, не обязательно первому из них.
Графический интерфейс построен с помощью компоновщика, где у каждого элемента есть ссылка на свой элемент-контейнер. Цепочку можно выстроить, пройдясь по всем контейнерам, в которые вложен элемент.
Графический интерфейс приложения обычно структурирован в виде дерева. Класс Диалог
, отображающий всё окно приложения — это корень дерева. Диалог содержит Панели
, которые, в свою очередь, могут содержать либо другие вложенные панели, либо простые элементы, вроде
.
Простые элементы могут показывать небольшие подсказки, если для них указан текст помощи. Но есть и более сложные компоненты, для которых этот способ демонстрации помощи слишком прост. Они определяют собственный способ отображения контекстной помощи.
Пример вызова контекстной помощи в цепочке объектов UI.
Когда пользователь наводит указатель мыши на элемент и жмёт клавишу F1
, приложение шлёт этому элементу запрос на показ помощи. Если он не содержит никакой справочной информации, запрос путешествует далее по списку контейнера элемента, пока не находится тот, который способен отобразить помощь.
// Интерфейс обработчиков.
interface ComponentWithContextualHelp is
method showHelp()
// Базовый класс простых компонентов.
abstract class Component implements ComponentWithContextualHelp is
field tooltipText: string
// Контейнер, содержащий компонент, служит в качестве
// следующего звена цепочки.
protected field container: Container
// Базовое поведение компонента заключается в том, чтобы
// показать всплывающую подсказку, если для неё задан текст.
// В обратном случае — перенаправить запрос своему
// контейнеру, если тот существует.
method showHelp() is
if (tooltipText != null)
// Показать подсказку.
else
container.showHelp()
// Контейнеры могут включать в себя как простые компоненты, так
// и другие контейнеры. Здесь формируются связи цепочки. Класс
// контейнера унаследует метод showHelp от своего родителя —
// базового компонента.
abstract class Container extends Component is
protected field children: array of Component
method add(child) is
children. add(child)
child.container = this
// Большинство примитивных компонентов устроит базовое поведение
// показа помощи через подсказку, которое они унаследуют из
// класса Component.
class Button extends Component is
// ...
// Но сложные компоненты могут переопределять метод показа
// помощи по-своему. Но и в этом случае они всегда могут
// вернуться к базовой реализации, вызвав метод родителя.
class Panel extends Container is
field modalHelpText: string
method showHelp() is
if (modalHelpText != null)
// Показать модальное окно с помощью.
else
super.showHelp()
// ...то же, что и выше...
class Dialog extends Container is
field wikiPageURL: string
method showHelp() is
if (wikiPageURL != null)
// Открыть страницу Wiki в браузере.
else
super.showHelp()
// Клиентский код.
class Application is
// Каждое приложение конфигурирует цепочку по-своему.
method createUI() is
dialog = new Dialog("Budget Reports")
dialog. wikiPageURL = "http://..."
panel = new Panel(0, 0, 400, 800)
panel.modalHelpText = "This panel does..."
ok = new Button(250, 760, 50, 20, "OK")
ok.tooltipText = "This is an OK button that..."
cancel = new Button(320, 760, 50, 20, "Cancel")
// ...
panel.add(ok)
panel.add(cancel)
dialog.add(panel)
// Представьте, что здесь произойдёт.
method onF1KeyPress() is
component = this.getComponentAtMouseCoords()
component.showHelp()
ПрименимостьКогда программа должна обрабатывать разнообразные запросы несколькими способами, но заранее неизвестно, какие конкретно запросы будут приходить и какие обработчики для них понадобятся.
С помощью Цепочки обязанностей вы можете связать потенциальных обработчиков в одну цепь и при получении запроса поочерёдно спрашивать каждого из них, не хочет ли он обработать запрос.
Когда важно, чтобы обработчики выполнялись один за другим в строгом порядке.
Цепочка обязанностей позволяет запускать обработчиков последовательно один за другим в том порядке, в котором они находятся в цепочке.
Когда набор объектов, способных обработать запрос, должен задаваться динамически.
В любой момент вы можете вмешаться в существующую цепочку и переназначить связи так, чтобы убрать или добавить новое звено.
Шаги реализацииСоздайте интерфейс обработчика и опишите в нём основной метод обработки.
Продумайте, в каком виде клиент должен передавать данные запроса в обработчик. Самый гибкий способ — превратить данные запроса в объект и передавать его целиком через параметры метода обработчика.
Имеет смысл создать абстрактный базовый класс обработчиков, чтобы не дублировать реализацию метода получения следующего обработчика во всех конкретных обработчиках.
Добавьте в базовый обработчик поле для хранения ссылки на следующий объект цепочки. Устанавливайте начальное значение этого поля через конструктор. Это сделает объекты обработчиков неизменяемыми. Но если программа предполагает динамическую перестройку цепочек, можете добавить и сеттер для поля.
Реализуйте базовый метод обработки так, чтобы он перенаправлял запрос следующему объекту, проверив его наличие. Это позволит полностью скрыть поле-ссылку от подклассов, дав им возможность передавать запросы дальше по цепи, обращаясь к родительской реализации метода.
Один за другим создайте классы конкретных обработчиков и реализуйте в них методы обработки запросов. При получении запроса каждый обработчик должен решить:
- Может ли он обработать запрос или нет?
- Следует ли передать запрос следующему обработчику или нет?
Клиент может собирать цепочку обработчиков самостоятельно, опираясь на свою бизнес-логику, либо получать уже готовые цепочки извне. В последнем случае цепочки собираются фабричными объектами, опираясь на конфигурацию приложения или параметры окружения.
Клиент может посылать запросы любому обработчику в цепи, а не только первому. Запрос будет передаваться по цепочке до тех пор, пока какой-то обработчик не откажется передавать его дальше, либо когда будет достигнут конец цепи.
Клиент должен знать о динамической природе цепочки и быть готов к таким случаям:
- Цепочка может состоять из единственного объекта.
- Запросы могут не достигать конца цепи.
- Запросы могут достигать конца, оставаясь необработанными.
- Уменьшает зависимость между клиентом и обработчиками.
- Реализует принцип единственной обязанности.
- Реализует принцип открытости/закрытости.
- Запрос может остаться никем не обработанным.
Цепочка обязанностей, Команда, Посредник и Наблюдатель показывают различные способы работы отправителей запросов с их получателями:
- Цепочка обязанностей передаёт запрос последовательно через цепочку потенциальных получателей, ожидая, что какой-то из них обработает запрос.
- Команда устанавливает косвенную одностороннюю связь от отправителей к получателям.
- Посредник убирает прямую связь между отправителями и получателями, заставляя их общаться опосредованно, через себя.
- Наблюдатель передаёт запрос одновременно всем заинтересованным получателям, но позволяет им динамически подписываться или отписываться от таких оповещений.
Цепочку обязанностей часто используют вместе с Компоновщиком. В этом случае запрос передаётся от дочерних компонентов к их родителям.
Обработчики в Цепочке обязанностей могут быть выполнены в виде Команд. В этом случае множество разных операций может быть выполнено над одним и тем же контекстом, коим является запрос.
Но есть и другой подход, в котором сам запрос является Командой, посланной по цепочке объектов. В этом случае одна и та же операция может быть выполнена над множеством разных контекстов, представленных в виде цепочки.
Цепочка обязанностей и Декоратор имеют очень похожие структуры. Оба паттерна базируются на принципе рекурсивного выполнения операции через серию связанных объектов. Но есть и несколько важных отличий.
Обработчики в Цепочке обязанностей могут выполнять произвольные действия, независимые друг от друга, а также в любой момент прерывать дальнейшую передачу по цепочке. С другой стороны Декораторы расширяют какое-то определённое действие, не ломая интерфейс базовой операции и не прерывая выполнение остальных декораторов.
Команда
Также известен как: Действие, Транзакция, Action, Command
Суть паттерна
Команда — это поведенческий паттерн проектирования, который превращает запросы в объекты, позволяя передавать их как аргументы при вызове методов, ставить запросы в очередь, логировать их, а также поддерживать отмену операций.
ПроблемаПредставьте, что вы работаете над программой текстового редактора. Дело как раз подошло к разработке панели управления. Вы создали класс красивых Кнопок
и хотите использовать его для всех кнопок приложения, начиная от панели управления, заканчивая простыми кнопками в диалогах.
Все кнопки приложения унаследованы от одного класса.
Все эти кнопки, хоть и выглядят схоже, но делают разные вещи. Поэтому возникает вопрос: куда поместить код обработчиков кликов по этим кнопкам? Самым простым решением было бы создать подклассы для каждой кнопки и переопределить в них метод действия под разные задачи.
Множество подклассов кнопок.
Но скоро стало понятно, что такой подход никуда не годится. Во-первых, получается очень много подклассов. Во-вторых, код кнопок, относящийся к графическому интерфейсу, начинает зависеть от классов бизнес-логики, которая довольно часто меняется.
Несколько классов дублируют одну и ту же функциональность.
Но самое обидное ещё впереди. Ведь некоторые операции, например, «сохранить», можно вызывать из нескольких мест: нажав кнопку на панели управления, вызвав контекстное меню или просто нажав клавиши Ctrl+S
. Когда в программе были только кнопки, код сохранения имелся только в подклассе SaveButton
. Но теперь его придётся продублировать ещё в два класса.
Хорошие программы обычно структурированы в виде слоёв. Самый распространённый пример — слои пользовательского интерфейса и бизнес-логики. Первый всего лишь рисует красивую картинку для пользователя. Но когда нужно сделать что-то важное, интерфейс «просит» слой бизнес-логики заняться этим.
В реальности это выглядит так: один из объектов интерфейса напрямую вызывает метод одного из объектов бизнес-логики, передавая в него какие-то параметры.
Прямой доступ из UI в бизнес-логику.
Паттерн Команда предлагает больше не отправлять такие вызовы напрямую. Вместо этого каждый вызов, отличающийся от других, следует завернуть в собственный класс с единственным методом, который и будет осуществлять вызов. Такие объекты называют командами.
К объекту интерфейса можно будет привязать объект команды, который знает, кому и в каком виде следует отправлять запросы. Когда объект интерфейса будет готов передать запрос, он вызовет метод команды, а та — позаботится обо всём остальном.
Доступ из UI в бизнес-логику через команду.
Классы команд можно объединить под общим интерфейсом c единственным методом запуска. После этого одни и те же отправители смогут работать с различными командами, не привязываясь к их классам. Даже больше: команды можно будет взаимозаменять на лету, изменяя итоговое поведение отправителей.
Параметры, с которыми должен быть вызван метод объекта получателя, можно загодя сохранить в полях объекта-команды. Благодаря этому, объекты, отправляющие запросы, могут не беспокоиться о том, чтобы собрать необходимые для получателя данные. Более того, они теперь вообще не знают, кто будет получателем запроса. Вся эта информация скрыта внутри команды.
Классы UI делегируют работу командам.
После применения Команды в нашем примере с текстовым редактором вам больше не потребуется создавать уйму подклассов кнопок под разные действия. Будет достаточно единственного класса с полем для хранения объекта команды.
Используя общий интерфейс команд, объекты кнопок будут ссылаться на объекты команд различных типов. При нажатии кнопки будут делегировать работу связанным командам, а команды — перенаправлять вызовы тем или иным объектам бизнес-логики.
Так же можно поступить и с контекстным меню, и с горячими клавишами. Они будут привязаны к тем же объектам команд, что и кнопки, избавляя классы от дублирования.
Таким образом, команды станут гибкой прослойкой между пользовательским интерфейсом и бизнес-логикой. И это лишь малая доля пользы, которую может принести паттерн Команда!
Аналогия из жизниПример заказа в ресторане.
Вы заходите в ресторан и садитесь у окна. К вам подходит вежливый официант и принимает заказ, записывая все пожелания в блокнот. Откланявшись, он уходит на кухню, где вырывает лист из блокнота и клеит на стену. Далее лист оказывается в руках повара, который читает содержание заказа и готовит заказанные блюда.
В этом примере вы являетесь отправителем, официант с блокнотом — командой, а повар — получателем. Как и в паттерне, вы не соприкасаетесь напрямую с поваром. Вместо этого вы отправляете заказ с официантом, который самостоятельно «настраивает» повара на работу. С другой стороны, повар не знает, кто конкретно послал ему заказ. Но это ему безразлично, так как вся необходимая информация есть в листе заказа.
СтруктураОтправитель хранит ссылку на объект команды и обращается к нему, когда нужно выполнить какое-то действие. Отправитель работает с командами только через их общий интерфейс. Он не знает, какую конкретно команду использует, так как получает готовый объект команды от клиента.
Команда описывает общий для всех конкретных команд интерфейс. Обычно здесь описан всего один метод для запуска команды.
Конкретные команды реализуют различные запросы, следуя общему интерфейсу команд. Обычно команда не делает всю работу самостоятельно, а лишь передаёт вызов получателю, которым является один из объектов бизнес-логики.
Параметры, с которыми команда обращается к получателю, следует хранить в виде полей. В большинстве случаев объекты команд можно сделать неизменяемыми, передавая в них все необходимые параметры только через конструктор.
Получатель содержит бизнес-логику программы. В этой роли может выступать практически любой объект. Обычно команды перенаправляют вызовы получателям. Но иногда, чтобы упростить программу, вы можете избавиться от получателей, «слив» их код в классы команд.
Клиент создаёт объекты конкретных команд, передавая в них все необходимые параметры, среди которых могут быть и ссылки на объекты получателей. После этого клиент связывает объекты отправителей с созданными командами.
В этом примере паттерн Команда служит для ведения истории выполненных операций, позволяя отменять их, если потребуется.
Пример реализации отмены в текстовом редакторе.
Команды, которые меняют состояние редактора (например, команда вставки текста из буфера обмена), сохраняют копию состояния редактора перед выполнением действия. Копии выполненных команд помещаются в историю команд, откуда они могут быть получены, если нужно будет сделать отмену операции.
Классы элементов интерфейса, истории команд и прочие не зависят от конкретных классов команд, так как работают с ними через общий интерфейс. Это позволяет добавлять в приложение новые команды, не изменяя существующий код.
// Абстрактная команда задаёт общий интерфейс для конкретных
// классов команд и содержит базовое поведение отмены операции.
abstract class Command is
protected field app: Application
protected field editor: Editor
protected field backup: text
constructor Command(app: Application, editor: Editor) is
this.app = app
this.editor = editor
// Сохраняем состояние редактора.
method saveBackup() is
backup = editor.text
// Восстанавливаем состояние редактора.
method undo() is
editor.text = backup
// Главный метод команды остаётся абстрактным, чтобы каждая
// конкретная команда определила его по-своему. Метод должен
// возвратить true или false в зависимости о того, изменила
// ли команда состояние редактора, а значит, нужно ли её
// сохранить в истории.
abstract method execute()
// Конкретные команды.
class CopyCommand extends Command is
// Команда копирования не записывается в историю, так как
// она не меняет состояние редактора.
method execute() is
app.clipboard = editor.getSelection()
return false
class CutCommand extends Command is
// Команды, меняющие состояние редактора, сохраняют
// состояние редактора перед своим действием и сигнализируют
// об изменении, возвращая true.
method execute() is
saveBackup()
app.clipboard = editor.getSelection()
editor.deleteSelection()
return true
class PasteCommand extends Command is
method execute() is
saveBackup()
editor.replaceSelection(app.clipboard)
return true
// Отмена — это тоже команда.
class UndoCommand extends Command is
method execute() is
app.undo()
return false
// Глобальная история команд — это стек.
class CommandHistory is
private field history: array of Command
// Последний зашедший...
method push(c: Command) is
// Добавить команду в конец массива-истории.
// ...выходит первым.
method pop():Command is
// Достать последнюю команду из массива-истории.
// Класс редактора содержит непосредственные операции над
// текстом. Он отыгрывает роль получателя — команды делегируют
// ему свои действия.
class Editor is
field text: string
method getSelection() is
// Вернуть выбранный текст.
method deleteSelection() is
// Удалить выбранный текст.
method replaceSelection(text) is
// Вставить текст из буфера обмена в текущей позиции.
// Класс приложения настраивает объекты для совместной работы.
// Он выступает в роли отправителя — создаёт команды, чтобы
// выполнить какие-то действия.
class Application is
field clipboard: string
field editors: array of Editors
field activeEditor: Editor
field history: CommandHistory
// Код, привязывающий команды к элементам интерфейса, может
// выглядеть примерно так.
method createUI() is
// ...
copy = function() {executeCommand(
new CopyCommand(this, activeEditor)) }
copyButton.setCommand(copy)
shortcuts. onKeyPress("Ctrl+C", copy)
cut = function() { executeCommand(
new CutCommand(this, activeEditor)) }
cutButton.setCommand(cut)
shortcuts.onKeyPress("Ctrl+X", cut)
paste = function() { executeCommand(
new PasteCommand(this, activeEditor)) }
pasteButton.setCommand(paste)
shortcuts.onKeyPress("Ctrl+V", paste)
undo = function() { executeCommand(
new UndoCommand(this, activeEditor)) }
undoButton.setCommand(undo)
shortcuts.onKeyPress("Ctrl+Z", undo)
// Запускаем команду и проверяем, надо ли добавить её в
// историю.
method executeCommand(command) is
if (command.execute())
history.push(command)
// Берём последнюю команду из истории и заставляем её все
// отменить. Мы не знаем конкретный тип команды, но это и не
// важно, так как каждая команда знает, как отменить своё
// действие.
method undo() is
command = history.pop()
if (command != null)
command. undo()
ПрименимостьКогда вы хотите параметризовать объекты выполняемым действием.
Команда превращает операции в объекты. А объекты можно передавать, хранить и взаимозаменять внутри других объектов.
Скажем, вы разрабатываете библиотеку графического меню и хотите, чтобы пользователи могли использовать меню в разных приложениях, не меняя каждый раз код ваших классов. Применив паттерн, пользователям не придётся изменять классы меню, вместо этого они будут конфигурировать объекты меню различными командами.
Когда вы хотите ставить операции в очередь, выполнять их по расписанию или передавать по сети.
Как и любые другие объекты, команды можно сериализовать, то есть превратить в строку, чтобы потом сохранить в файл или базу данных. Затем в любой удобный момент её можно достать обратно, снова превратить в объект команды и выполнить. Таким же образом команды можно передавать по сети, логировать или выполнять на удалённом сервере.
Когда вам нужна операция отмены.
Главная вещь, которая вам нужна, чтобы иметь возможность отмены операций, — это хранение истории. Среди многих способов, которыми можно это сделать, паттерн Команда является, пожалуй, самым популярным.
История команд выглядит как стек, в который попадают все выполненные объекты команд. Каждая команда перед выполнением операции сохраняет текущее состояние объекта, с которым она будет работать. После выполнения операции копия команды попадает в стек истории, все ещё неся в себе сохранённое состояние объекта. Если потребуется отмена, программа возьмёт последнюю команду из истории и возобновит сохранённое в ней состояние.
Этот способ имеет две особенности. Во-первых, точное состояние объектов не так-то просто сохранить, ведь часть его может быть приватным. Но с этим может помочь справиться паттерн Снимок.
Во-вторых, копии состояния могут занимать довольно много оперативной памяти. Поэтому иногда можно прибегнуть к альтернативной реализации, когда вместо восстановления старого состояния команда выполняет обратное действие. Недостаток этого способа в сложности (а иногда и невозможности) реализации обратного действия.
Шаги реализацииСоздайте общий интерфейс команд и определите в нём метод запуска.
Один за другим создайте классы конкретных команд. В каждом классе должно быть поле для хранения ссылки на один или несколько объектов-получателей, которым команда будет перенаправлять основную работу.
Кроме этого, команда должна иметь поля для хранения параметров, которые нужны при вызове методов получателя. Значения всех этих полей команда должна получать через конструктор.
И, наконец, реализуйте основной метод команды, вызывая в нём те или иные методы получателя.
Добавьте в классы отправителей поля для хранения команд. Обычно объекты-отправители принимают готовые объекты команд извне — через конструктор либо через сеттер поля команды.
Измените основной код отправителей так, чтобы они делегировали выполнение действия команде.
Порядок инициализации объектов должен выглядеть так:
- Создаём объекты получателей.
- Создаём объекты команд, связав их с получателями.
- Создаём объекты отправителей, связав их с командами.
- Убирает прямую зависимость между объектами, вызывающими операции, и объектами, которые их непосредственно выполняют.
- Позволяет реализовать простую отмену и повтор операций.
- Позволяет реализовать отложенный запуск операций.
- Позволяет собирать сложные команды из простых.
- Реализует принцип открытости/закрытости.
- Усложняет код программы из-за введения множества дополнительных классов.
Цепочка обязанностей, Команда, Посредник и Наблюдатель показывают различные способы работы отправителей запросов с их получателями:
- Цепочка обязанностей передаёт запрос последовательно через цепочку потенциальных получателей, ожидая, что какой-то из них обработает запрос.
- Команда устанавливает косвенную одностороннюю связь от отправителей к получателям.
- Посредник убирает прямую связь между отправителями и получателями, заставляя их общаться опосредованно, через себя.
- Наблюдатель передаёт запрос одновременно всем заинтересованным получателям, но позволяет им динамически подписываться или отписываться от таких оповещений.
Обработчики в Цепочке обязанностей могут быть выполнены в виде Команд. В этом случае множество разных операций может быть выполнено над одним и тем же контекстом, коим является запрос.
Но есть и другой подход, в котором сам запрос является Командой, посланной по цепочке объектов. В этом случае одна и та же операция может быть выполнена над множеством разных контекстов, представленных в виде цепочки.
Команду и Снимок можно использовать сообща для реализации отмены операций. В этом случае объекты команд будут отвечать за выполнение действия над объектом, а снимки будут хранить резервную копию состояния этого объекта, сделанную перед самым запуском команды.
Команда и Стратегия похожи по духу, но отличаются масштабом и применением:
- Команду используют, чтобы превратить любые разнородные действия в объекты. Параметры операции превращаются в поля объекта. Этот объект теперь можно логировать, хранить в истории для отмены, передавать во внешние сервисы и так далее.
- С другой стороны, Стратегия описывает разные способы произвести одно и то же действие, позволяя взаимозаменять эти способы в каком-то объекте контекста.
Если Команду нужно копировать перед вставкой в историю выполненных команд, вам может помочь Прототип.
Посетитель можно рассматривать как расширенный аналог Команды, который способен работать сразу с несколькими видами получателей.
Посредник
Также известен как: Intermediary, Controller, Mediator
Суть паттерна
Посредник — это поведенческий паттерн проектирования, который позволяет уменьшить связанность множества классов между собой, благодаря перемещению этих связей в один класс-посредник.
ПроблемаПредположим, что у вас есть диалог создания профиля пользователя. Он состоит из всевозможных элементов управления — текстовых полей, чекбоксов, кнопок.
Беспорядочные связи между элементами пользовательского интерфейса.
Отдельные элементы диалога должны взаимодействовать друг с другом. Так, например, чекбокс «у меня есть собака» открывает скрытое поле для ввода имени домашнего любимца, а клик по кнопке отправки запускает проверку значений всех полей формы.
Код элементов нужно трогать при изменении каждого диалога.
Прописав эту логику прямо в коде элементов управления, вы поставите крест на их повторном использовании в других местах приложения. Они станут слишком тесно связанными с элементами диалога редактирования профиля, которые не нужны в других контекстах. Поэтому вы сможете использовать либо все элементы сразу, либо ни одного.
РешениеПаттерн Посредник заставляет объекты общаться не напрямую друг с другом, а через отдельный объект-посредник, который знает, кому нужно перенаправить тот или иной запрос. Благодаря этому, компоненты системы будут зависеть только от посредника, а не от десятков других компонентов.
В нашем примере посредником мог бы стать диалог. Скорее всего, класс диалога и так знает, из каких элементов состоит, поэтому никаких новых связей добавлять в него не придётся.
Элементы интерфейса общаются через посредника.
Основные изменения произойдут внутри отдельных элементов диалога. Если раньше при получении клика от пользователя объект кнопки сам проверял значения полей диалога, то теперь его единственной обязанностью будет сообщить диалогу о том, что произошёл клик. Получив извещение, диалог выполнит все необходимые проверки полей. Таким образом, вместо нескольких зависимостей от остальных элементов кнопка получит только одну — от самого диалога.
Чтобы сделать код ещё более гибким, можно выделить общий интерфейс для всех посредников, то есть диалогов программы. Наша кнопка станет зависимой не от конкретного диалога создания пользователя, а от абстрактного, что позволит использовать её и в других диалогах.
Таким образом, посредник скрывает в себе все сложные связи и зависимости между классами отдельных компонентов программы. А чем меньше связей имеют классы, тем проще их изменять, расширять и повторно использовать.
Аналогия из жизниПилоты самолётов общаются не напрямую, а через диспетчера.
Пилоты садящихся или улетающих самолётов не общаются напрямую с другими пилотами. Вместо этого они связываются с диспетчером, который координирует действия нескольких самолётов одновременно. Без диспетчера пилотам приходилось бы все время быть начеку и следить за всеми окружающими самолётами самостоятельно, а это приводило бы к частым катастрофам в небе.
Важно понимать, что диспетчер не нужен во время всего полёта. Он задействован только в зоне аэропорта, когда нужно координировать взаимодействие многих самолётов.
СтруктураКомпоненты — это разнородные объекты, содержащие бизнес-логику программы. Каждый компонент хранит ссылку на объект посредника, но работает с ним только через абстрактный интерфейс посредников. Благодаря этому, компоненты можно повторно использовать в другой программе, связав их с посредником другого типа.
Посредник определяет интерфейс для обмена информацией с компонентами. Обычно хватает одного метода, чтобы оповещать посредника о событиях, произошедших в компонентах. В параметрах этого метода можно передавать детали события: ссылку на компонент, в котором оно произошло, и любые другие данные.
Конкретный посредник содержит код взаимодействия нескольких компонентов между собой. Зачастую этот объект не только хранит ссылки на все свои компоненты, но и сам их создаёт, управляя дальнейшим жизненным циклом.
Компоненты не должны общаться друг с другом напрямую. Если в компоненте происходит важное событие, он должен оповестить своего посредника, а тот сам решит — касается ли событие других компонентов, и стоит ли их оповещать. При этом компонент-отправитель не знает кто обработает его запрос, а компонент-получатель не знает кто его прислал.
В этом примере Посредник помогает избавиться от зависимостей между классами различных элементов пользовательского интерфейса: кнопками, чекбоксами и надписями.
Пример структурирования классов UI-диалогов.
По реакции на действия пользователей элементы не взаимодействуют напрямую, а всего лишь уведомляют посредника о том, что они изменились.
Посредник в виде диалога авторизации знает, как конкретные элементы должны взаимодействовать. Поэтому при получении уведомлений он может перенаправить вызов тому или иному элементу.
// Общий интерфейс посредников.
interface Mediator is
method notify(sender: Component, event: string)
// Конкретный посредник. Все связи между конкретными
// компонентами переехали в код посредника. Он получает
// извещения от своих компонентов и знает, как на них
// реагировать.
class AuthenticationDialog implements Mediator is
private field title: string
private field loginOrRegisterChkBx: Checkbox
private field loginUsername, loginPassword: Textbox
private field registrationUsername, registrationPassword,
registrationEmail: Textbox
private field okBtn, cancelBtn: Button
constructor AuthenticationDialog() is
// Здесь нужно создать объекты всех компонентов, подав
// текущий объект-посредник в их конструктор.
// Когда что-то случается с компонентом, он шлёт посреднику
// оповещение. После получения извещения посредник может
// либо сделать что-то самостоятельно, либо перенаправить
// запрос другому компоненту.
method notify(sender, event) is
if (sender == loginOrRegisterChkBx and event == "check")
if (loginOrRegisterChkBx.checked)
title = "Log in"
// 1. Показать компоненты формы входа.
// 2. Скрыть компоненты формы регистрации.
else
title = "Register"
// 1. Показать компоненты формы регистрации.
// 2. Скрыть компоненты формы входа.
if (sender == okBtn && event == "click")
if (loginOrRegister.checked)
// Попробовать найти пользователя с данными из
// формы логина.
if (!found)
// Показать ошибку над формой логина.
else
// 1. Создать пользовательский аккаунт с данными
// из формы регистрации.
// 2. Авторизировать этого пользователя.
// ...
// Классы компонентов общаются с посредниками через их общий
// интерфейс. Благодаря этому одни и те же компоненты можно
// использовать в разных посредниках.
class Component is
field dialog: Mediator
constructor Component(dialog) is
this.dialog = dialog
method click() is
dialog.notify(this, "click")
method keypress() is
dialog.notify(this, "keypress")
// Конкретные компоненты не связаны между собой напрямую. У них
// есть только один канал общения — через отправку уведомлений
// посреднику.
class Button extends Component is
// ...
class Textbox extends Component is
// ...
class Checkbox extends Component is
method check() is
dialog.notify(this, "check")
// ...
ПрименимостьКогда вам сложно менять некоторые классы из-за того, что они имеют множество хаотичных связей с другими классами.
Посредник позволяет поместить все эти связи в один класс, после чего вам будет легче их отрефакторить, сделать более понятными и гибкими.
Когда вы не можете повторно использовать класс, поскольку он зависит от уймы других классов.
После применения паттерна компоненты теряют прежние связи с другими компонентами, а всё их общение происходит косвенно, через объект-посредник.
Когда вам приходится создавать множество подклассов компонентов, чтобы использовать одни и те же компоненты в разных контекстах.
Если раньше изменение отношений в одном компоненте могли повлечь за собой лавину изменений во всех остальных компонентах, то теперь вам достаточно создать подкласс посредника и поменять в нём связи между компонентами.
Шаги реализацииНайдите группу тесно переплетённых классов, отвязав которые друг от друга, можно получить некоторую пользу. Например, чтобы повторно использовать их код в другой программе.
Создайте общий интерфейс посредников и опишите в нём методы для взаимодействия с компонентами. В простейшем случае достаточно одного метода для получения оповещений от компонентов.
Этот интерфейс необходим, если вы хотите повторно использовать классы компонентов для других задач. В этом случае всё, что нужно сделать — это создать новый класс конкретного посредника.
Реализуйте этот интерфейс в классе конкретного посредника. Поместите в него поля, которые будут содержать ссылки на все объекты компонентов.
Вы можете пойти дальше и переместить код создания компонентов в класс посредника, после чего он может напоминать фабрику или фасад.
Компоненты тоже должны иметь ссылку на объект посредника. Связь между ними удобнее всего установить, подавая посредника в параметры конструктора компонентов.
Измените код компонентов так, чтобы они вызывали метод оповещения посредника, вместо методов других компонентов. С противоположной стороны, посредник должен вызывать методы нужного компонента, когда получает оповещение от компонента.
- Устраняет зависимости между компонентами, позволяя повторно их использовать.
- Упрощает взаимодействие между компонентами.
- Централизует управление в одном месте.
Цепочка обязанностей, Команда, Посредник и Наблюдатель показывают различные способы работы отправителей запросов с их получателями:
- Цепочка обязанностей передаёт запрос последовательно через цепочку потенциальных получателей, ожидая, что какой-то из них обработает запрос.
- Команда устанавливает косвенную одностороннюю связь от отправителей к получателям.
- Посредник убирает прямую связь между отправителями и получателями, заставляя их общаться опосредованно, через себя.
- Наблюдатель передаёт запрос одновременно всем заинтересованным получателям, но позволяет им динамически подписываться или отписываться от таких оповещений.
Посредник и Фасад похожи тем, что пытаются организовать работу множества существующих классов.
- Фасад создаёт упрощённый интерфейс к подсистеме, не внося в неё никакой добавочной функциональности. Сама подсистема не знает о существовании Фасада. Классы подсистемы общаются друг с другом напрямую.
- Посредник централизует общение между компонентами системы. Компоненты системы знают только о существовании Посредника, у них нет прямого доступа к другим компонентам.
Разница между Посредником и Наблюдателем не всегда очевидна. Чаще всего они выступают как конкуренты, но иногда могут работать вместе.
Цель Посредника — убрать обоюдные зависимости между компонентами системы. Вместо этого они становятся зависимыми от самого посредника. С другой стороны, цель Наблюдателя — обеспечить динамическую одностороннюю связь, в которой одни объекты косвенно зависят от других.
Довольно популярна реализация Посредника при помощи Наблюдателя. При этом объект посредника будет выступать издателем, а все остальные компоненты станут подписчиками и смогут динамически следить за событиями, происходящими в посреднике. В этом случае трудно понять, чем же отличаются оба паттерна.
Но Посредник имеет и другие реализации, когда отдельные компоненты жёстко привязаны к объекту посредника. Такой код вряд ли будет напоминать Наблюдателя, но всё же останется Посредником.
Напротив, в случае реализации посредника с помощью Наблюдателя представим такую программу, в которой каждый компонент системы становится издателем. Компоненты могут подписываться друг на друга, в то же время не привязываясь к конкретным классам. Программа будет состоять из целой сети Наблюдателей, не имея центрального объекта-Посредника.
Как поведенческие паттерны влияют на прибыльность клиента :: РБК Pro
Что такое поведенческие паттерны, как они меняются и какое влияние оказывают на продажи, рассказал Владимир Средников, эксперт по стратегии ГК «Корус Консалтинг»
Основная конкурентная борьба крупнейших брендов смещается из области создания и продвижения продуктов в сферу управления удовлетворенностью клиентов. В этой ситуации компаниям все сложнее выстроить эффективную работу с потребителями.
В последние 20 лет за счет стремительного развития технологий роль взаимоотношений между клиентом и компанией возросла многократно. Потребители все больше нуждаются в доверии, которое появляется в результате успешного опыта взаимодействия с продавцом. Однако, смещая фокус с продукта на клиента, инвестируя в уникальный опыт взаимодействия и пытаясь удовлетворить сразу всех покупателей, компания рискует стать убыточной. Поэтому для успешного внедрения сбалансированной клиентоцентричной бизнес-модели необходимо использовать стратегический подход.
Бизнес должен распределять инвестиции во взаимоотношения с клиентами на основе ценности, которую они приносят. Чаще всего она характеризуется текущими и потенциальными показателями прибыльности и оборота, но могут быть и другие критерии в зависимости от стратегии компании.
Поведенческие паттерны — «шаблоны», по которым действуют клиенты при принятии решений о покупке или взаимодействии с компанией. Какие-то из этих шаблонов приводят к взаимовыгодному сотрудничеству и высокой прибыльности, другие — к оттоку покупателей или долгим убыточным отношениям. Задача компании — стимулировать «правильное» поведение или, другими словами, инициировать поведенческие паттерны, которые влияют на прибыльность и стратегические цели компании.
Какими бывают поведенческие паттерны
Определить поведенческие паттерны поможет сегментация. В качестве отправной точки можно взять критерии отбора, которые уже используются в компании, — на основе потребностей, социально-демографических характеристик и т.д. — и потом добавить дополнительные параметры. К ним относятся те, которые отображают особенности поведения клиентов: частота покупок, коэффициент повторных покупок, средний чек, предпочтительные каналы.
Коррекционная работа с поведенческими паттернами Текст научной статьи по специальности «Психологические науки»
УДК 159.9.019.43 Е. А. Малько
E. A. Malko
Научный руководитель: д-р филос. наук Г. В. Горнова Research supervisor: Doctor of Philosophical Science G. V. Gornova
КОРРЕКЦИОННАЯ РАБОТА CORRECTIONAL WORK
С ПОВЕДЕНЧЕСКИМИ ПАТТЕРНАМИ WITH BEHAVIORAL PATTERNS
В статье рассматривается феномен «поведенческий паттерн», определяется его структура, выявляются его основные компоненты и возможности коррекционной работы. Основная цель — изучить природу паттернов и определить их взаимосвязь с поведением индивида.
Ключевые слова: паттерн, поведение, коррекция паттернов.
This article is devoted to the phenomenon of behavioral pattern. Its structure and main components are considered. Some options of working with patterns are given. The main purpose is to explore the origin of patterns and to establish the link between them and the person’s behavior.
Keywords: pattern, behavior, correction of the patterns.
При работе с людьми, участвовавшими в военных действиях, ключевым моментом выступает работа с поведенческими паттернами. Термин «паттерн» (от английского pattern — «шаблон», «модель», «система», «структура» [1, с. 120]) применяется в различных научных дисциплинах и сферах деятельности. Бихевиоральные теории и теории научения утверждают, что страхи и тревоги приобретаются путем формирования условных рефлексов, т. е. паттернов. Согласно учению Скиннера, опыт складывается в процессе научения, результатом которого является приобретение специфического для каждого человека набора поведенческих реакций. Поведенческие и эмоциональные проблемы понимаются как закрепленные в результате поощрения и подкрепления дезадап-тивных реакций на средовые раздражители.
Рассмотрим структуру поведенческого паттерна:
1. Восприятие реальности, которая не устраивает.
2. Формирование программы поведения (на основе врожденных инстинктов, приобретенного опыта и случайных догадок).
3. Реализация программы поведения — собственно действие.
4. Сопоставление полученного результата с результатом желаемым.
5. В случае, если результат желаемый с полученным совпал — прекращение действия.
6. В случае, если результат желаемый с полученным не совпал — формирование новой или повторение сформированной до этого программы поведения [1, с. 122].
Традиционно в структуре поведенческого паттерна выделяют следующие основные компоненты:
1) когнитивный — осознание страха;
2) физиологический — учащенное сердцебиение, головокружение, паническое состояние и т. д.;
3) поведенческий — побуждения убежать или напасть [1, с. 125].
При рассмотрении любой области человеческого поведения, где применяются шаблоны, можно говорить о паттернах. Например, гипнотический паттерн — это
текст, который использует гипнолог, чтобы ввести человека в транс. Словесные паттерны — это речевые приемы, которые мы сознательно или бессознательно применяем в речи. Паттерны мышления — мыслительные шаблоны, в частности обобщения.
Индивидам свойственна стереотипизация поведения, выработка определенных способов взаимодействия с окружающим миром. Это объясняется принципом рациональности: вместо того чтобы каждый раз изобретать новые способы реагирования на различные явления, человек воспроизводит готовую модель. Поведенческие паттерны формируются в процессе обучения, воспитания, а также наблюдения за окружающими.
Зная о том, как индивид вел себя в определенных ситуациях, какие у него имеются паттерны поведения, можно спрогнозировать его действия и поступки в схожих ситуациях. Для этого необходимо изучить личность комплексно, учитывая весь жизненный опыт.
Паттерны характеризуются устойчивостью и поэтому трудно поддаются изменению. Для корректировки поведения Э. Эриксон использует особые формы вмешательства, базируясь на нескольких предпосылках. В их число входят: 1) наблюдение, согласно которому любое изменение повлечет за собой новые формы взаимодействия и опыта, поскольку формы человеческого поведения носят паттерновый характер; 2) наблюдение, согласно которому паттерны поведения быстро закрепляются благодаря соответствующим цепям средовой обратной связи, порождаемой этими новыми формами поведения; 3) представление о том, что, для того чтобы достичь глубоких и долгосрочных изменений, не обязательно изучать онтогенез проблемы; 4) наличие соответствия между моделью мира и поведением конкретного человека, так что изменение индивидуального поведения оказывает непосредственное влияние на его опыт и обобщения [2, с. 22].
Таким образом, если изменить поведенческие паттерны человека, его опыт также станет более позитивным, и тогда он будет использовать данную форму поведения достаточно долго для того, чтобы сформировались вне-
122
Гуманитарные исследования • 2015 • № 1 (5)
шние и внутренние реакции, необходимые для постоянного закрепления новой формы поведения.
В общем виде базовая схема поведенческого вмешательства имеет следующий вид:
1. Идентифицировать для себя результат, которого должен достичь индивид с точки зрения того, какие формы поведения или взаимодействий ему необходимо реализовать в проблемном контексте.
2. Идентифицировать для себя ситуацию, к которой естественным образом приходит любой человек, вовлеченный в данное поведение или взаимодействие.
3. Установить специфический контакт, включающий определенную меру доверия и взаимопонимания с человеком или группой людей [2, с. 23].
Таким образом, паттерн имеет сложную структуру и тяжело поддается видоизменению, что особенно важно учитывать при необходимости коррекции негативных состояний. При работе со страхами и тревогами надо учитывать весь жизненный опыт человека, его физическое состояние.
Первым шагом в разработке методов коррекции поведенческих паттернов послужило экспериментальные исследования Д. Вальпо [3, с. 233]. Он проводил опыты над лабораторными животными и изучал возникновение и развитие невротической тревожности. Результаты работы позволили Д. Вальпо сделать вывод о том, что необходимо воздействовать на условные реакции, т. е. обеспечить угасание, основанное на механизме контробусловливания. Этот метод получил название систематическая десенсибилизация.
Д. Вальпо выдвинул гипотезу о том, что невротическое поведение человека определяется тревогой. Действия, которые происходят в воображении, равны действиям, совершаемым человеком в реальной жизни. Воображение в состоянии релаксации не является исключением из этого положения. Страх, тревога поддаются подавлению, при объединении во времени стимулов, вызывающих страх, и стимулов, противоположных ему. Произойдет контробусловливание: не вызывающий страх стимул подавит прежний рефлекс. У животных таким контробусловливанием выступает процесс кормления. У человека — релаксация. Поэтому, если обучить индивида глубокой релаксации и в этом состоянии спроектировать в воображении стимулы, вызывающие приступы тревоги, начнет действовать процесс десенсибилизации пациента к реальным стимулам или ситуациям, вызывающим страх. Процедура работы с тревогой выглядит таким образом: у человека, находящегося в состоянии глубо-
кой релаксации, вызываются стрессовые воспоминания, включающие страх, далее путем глубокого погружения в состояние релаксации индивид снимает тревожные приступы. Воображение проигрывает ситуации от самых легких до трудных, вызывающих наибольший страх. Процедура заканчивается, когда самый сильный стимул перестает вызывать страх.
Одним из вариантов работы с паттернами выступает проговаривание проблемы вслух, диалог между консультантом и индивидом, нуждающимся в помощи. В беседе основными средствами коррекции выступают вопросы по существу задачи и ответы на них, выполняющие функцию планирования способа ее решения; самоинструктирование с целью управления исполнением; реплики, ободряющие самого себя и направленные на преодоление фрустрации, неопределенности и тревожности; оценочные высказывания, выполняющие функцию самоподкрепления [3, с. 195]. Таким образом, человек корректирует свое поведение, учится формулировать проблему, анализировать ее, делать выводы, планировать и прогнозировать дальнейшие действия и давать оценку собственным мыслям, чувствам и поступкам.
Знание специфики поведенческих паттернов и способов коррекционной работы с ними может быть полезно при оказании консультативной помощи участникам вооруженных конфликтов. При работе с людьми, участвовавшими в боевых действиях, следует основной акцент сделать на анализ паттернов, которые были приобретены во время боевых действий. Это поможет выбрать необходимый метод коррекции и снизить уровень тревожности человека в реальной жизни. Главной задачей в данном случае является увеличение общей способности к разрешению проблемных ситуаций за счет развития умений специфицировать задачу, выдвигать и анализировать альтернативные варианты ее решения.
1. Жмуров В. А. Большая энциклопедия по психиатрии. 2-е изд. М.: Джан-гар, 2012. 169 с.
2. Гордон Д., Майерс-Андерсон М. Феникс. Терапевтические паттерны Милтона Эриксона. М.: Прайм-Еврознак, 2004. 187 с.
3. Паттерсон С., Уоткинс Э. Теории психотерапии. СПб.: Питер, 2003. 544 с.
© Малько Е. А., 2015
Гуманитарные исследования • 2015 • № 1 (5)
123
Культура, поведенческие паттерны и индуктивное мышление Текст научной статьи по специальности «Социологические науки»
о
28 ТЕОРИЯ И МЕТОДОЛОГИЯ ИНСТИТУЦИОНАЛЬНОЙ ЭКОНОМИКИ
www.hjournal.ru DOI: 10.17835/2076-6297.2016.8.4.028-039
КУЛЬТУРА, ПОВЕДЕНЧЕСКИЕ ПАТТЕРНЫ И ИНДУКТИВНОЕ МЫШЛЕНИЕ
ВОЛЬЧИК ВЯЧЕСЛАВ ВИТАЛЬЕВИЧ,
доктор экономических наук, профессор, Южный федеральный университет, г. Ростов-на-Дону,
e-mail: [email protected]
Исследования культуры становятся все более распространенными среди экономистов. В данной работе культура преимущественно рассматривается через призму подхода оригинальной (старой) институциональной экономической теории. Культура воспринимается акторами через доступные им поведенческие паттерны. Социальные ценности позволяют соотносить и согласовывать поведение, основывающееся на разных поведенческих паттернах в рамках той или иной культуры. Поэтому культура анализируется как совокупность социальных ^ ценностей, институтов и поведенческих паттернов в их связи со специфическими историческими особенностями эволюции общества. поведенческих паттернов предполагает изучение истории, дискурсов акторов, 2 нарративов, что позволяет отразить многообразие и специфику культуры и оо социальных ценностей. При сравнительном изучении поведенческих паттернов в | рамках различных культур возникают сложности, связанные и интерпретацией и пониманием ключевых институтов и ценностей. Изучение многообразия доступных для индивида или групп акторов поведенческих паттернов не дает нам >| возможности построить надежные дедуктивные предсказательные модели, которые могут использоваться вне культурного и временного контекстов.
0 Исследуя реальные экономические процессы, мы должны учитывать фактор <ц эволюции адаптивно-сложных систем. В процессе социальных и экономических 8 обменов, выбирая тот или иной поведенческий паттерн как релевантный,
акторы сталкиваются с реакцией других индивидов. В адаптивно-сложных
1 системах при исследовании экономического поведения необходимо учитывать тот
< факт, что регулярность социальных взаимодействий неизбежно порождает у о основных акторов опыт, который осмысливается ими с использованием
индуктивного мышления, отражаясь в их понимании существа социальных s взаимодействий в контексте культуры и социальных ценностей. Ключевые слова: институциональная экономика; культура; социальные
< ценности; поведенческие паттерны; индуктивное мышление.
со _
х
CULTURE, BEHAVIORAL PATTERNS AND INDUCTIVE
qj REASONING
55 VYACHESLAV V. VOLCHIK,
<
Department «Economic Theory», Southern Federal University, Rostov-on-Don, e-mail: [email protected]
en z
LL
о <
en
ZD —
2 © Вольчик В. В., 2016
Studies in culture are becoming more and more popular among economists. In this paper, culture is mainly considered in the framework of Original (Old) Institutional Economics. Basically, actors comprehend culture through behavioral patterns that are available to them. Social values correlate behaviors within and among various behavioral patterns in
different cultural contexts. That is why culture is regarded as a bunch of social values, institutions and behavioral patterns associated with specific historical features of social evolution. The identification of behavioral patterns implies analyzing historical facts, actors’ discourses and narratives. That enables us to reflect on how well we understand manifold social values and specific cultural features. We may face difficulties comparing behavioral patterns embedded in different cultures. These difficulties lie in interpreting and understanding dominant institutions and values. Examining various available behavioral patterns does not enable us to develop a reliable deductive model that can be used for making predictions, because such a model fails to take into account the time and cultural contexts. While analyzing real economic processes, we have to take into consideration the fact that complex adaptive systems are constantly evolving. In the process of social and economic exchanges, actors choose relevant behavioral patterns simultaneously analyzing other individuals’ reaction. The regularity of social interactions entails that involved actors gain experience. In complex adaptive systems, actors use inductive reasoning to comprehend their experience in the context of culture and prescribed social values.
Keywords: Institutional economics; culture; social values; behavior patterns; inductive reasoning.
CD
JEL: B52, Z13, B59.
экономических течений, то сейчас интерес к исследованиям культуры х
го
демонстрируют представители неоинституционализма и других конвергентных с ш мейнстримом научных школ. В рамках неоинституционализма культура чаще
рассматривается через призму экзогенных ограничений, связанных с о
неформальными институтами. Более того, сам феномен культуры фактически отождествляется с неформальными институтами. Культура (неформальные институты) в таком контексте рассматриваются в их взаимодействии с институтами (формальными институтами) (Alesina and Giuliano, 2015. Р. 902).
Культура имеет очень много значений в современном научном дискурсе социальных наук (Бёгельсдейк и Маселанд, 2016).
3
Культура как социальный феномен шире, чем совокупность неформальных институтов. Важность рассмотрения культуры подчеркивается в рамках развивающихся междисциплинарных исследованиях, например, социоэкономики. Социоэкономический подход А. Энтциони к исследованию культуры характеризуется ярко выраженным экономизмом (Этциони, 2002). Культура или относимые к культурным факторам переменные действительно могут рассматриваться как переменные, влияющие на рост ВВП, заработную плату или производительность труда.
В данной работе мы концентрируемся на объяснении феномена культуры в контексте экономического поведения акторов, которые формируют свои предпочтения на основе доступных и релевантных для них социальных ценностей, институтов и поведенческих паттернов. Включение в анализ концептов культуры и социальных ценностей позволяет расширить объяснительные возможности процесса эволюции институциональной системы общества с учетом современных тенденций развития институциональной экономической теории. рассматривается через восприятие индивидом доступных поведенческих паттернов,
1 которые, в свою очередь, являются частью культуры и связаны с релевантными ш социальными ценностями и институтами. Паттерн рационального
максимизирующего поведения может рассматриваться как один из большого множества доступных. Также надо учитывать взаимозависимость поведенческих паттернов, институтов и социальных ценностей, эволюционирующих в рамках 3 специфических национальных и наднациональных культур.
оо
5 О
О <
ф <
о о
X
I Социальные ценности и поведенческие паттерны
Культура формирует ментальные конструкты акторов (Норт, 2010) и
^ является важнейшим феноменом, связанным с совокупностью исторического
о наследия и эволюцией социальных ценностей (Иглхарт и Вейтцель, 2011). Наиболее полное определение в рамках неоинституционализма принадлежит о В. Л. Тамбовцеву: «Ценности — это обобщенные характеристики состояний индивида,
его ближнего и дальнего окружения (микро- и макросреды), которые (состояния) доставляли индивиду удовлетворение или удовольствие. Такие обобщенные характеристики формируются в результате процессов генерализации и категоризации восприятий (ощущений) индивида, в значительной мере независимо от его сознательных мыслительных операций» (Тамбовцев, 2014. С. 80). Важнейшим в этом определении является отсылка к «генерализации и категоризации восприятий (ощущений) индивида», которые воспринимаются другими индивидами в историческом контексте как социальные ценности. Можно дополнить, что «удовлетворение и удовольствие» не означает, что согласно воспринимаемым ценностям индивид перестает быть членом морального сообщества. Именно благодаря субъективно воспринимаемым ценностям индивиды выбирают или принимают те поведенческие паттерны, которые позволяют им лучше адаптироваться к меняющейся среде в эволюционном контексте. оценивает инструментарно достоверные модели поведения и есть критерий < инструментарной эффективности» (Bush, 1987. Р. 1080). Они служат для решения g текущих проблем общества, тесно связаны с инстинктом мастерства, создаются и прививаются населению через продуманную социальную политику, через Р? расширение запаса знаний и образование. о
Влияние культуры на экономическое поведение можно рассмотреть через призму восприятия и выбора акторами поведенческих паттернов. Необходимо отметить, что такой выбор отличается от стандартной экономической задачи, поскольку сама возможность осуществлять сопоставления по степени релевантности доступных поведенческих паттернов определяется предыдущим опытом £2
< пз
>у
социализации (которая зависит от существовавших ранее социальных ценностей, о
институтов и поведенческих паттернов), а также когнитивными особенностями ¡^
акторов.
(2) Понимание, что ценности являются связующими элементами поведения актора в о
рамках поведенческих паттернов. Термин «поведенческий паттерн» может <
рассматриваться как два «поведения», согласующиеся через ценности. Такое о:
со ■н о см
00
s о
понимание поведенческого паттерна в явном виде отражает социальную значимость ценностей. Ценности функционируют как стандарты оценки, которые делают поведение согласующимся. Ценности не только согласуют поведение внутри поведенческого паттерна, но также согласуют между собой поведенческие паттерны. Взаимозависимости среди поведенческих паттернов могут проявляться как зависимость одного «поведения» в рамках одного поведенческого паттерна с другим «поведением» в другом поведенческом паттерне через определенные ценности. В сущности, взаимосвязи между поведенческими паттернами совершенствуются через поведенческие паттерны» (Bush, 1987. Р. 1077-1078).
Рис. 1. Культура, социальные ценности и поведенческие паттерны
CD Ш
О <
ф <
о о s X -Û X
-Û
<
CD
О X
s
<
CD X Œ
ф Ш
СЯ <
О I— 3 t I—
ш
Ll_
О
_J <
СП 3
о
Культуру можно рассматривать как социальные ценности и институты, согласующие поведенческие паттерны, в контексте, обусловленном специфическими историческими особенностями эволюции общества (рис. 1). Культура предстает сложно организованной структурой, состоящих из социальных ценностей, институтов, рутин, технологий, которые в свою очередь связаны с еще большим множеством поведенческих паттернов. Индивиды следуют поведенческим паттернам, изменяют их, а также паттерны, как и институты посредством нисходящей причинной связи (Hodgson, 2003) влияют на познавательные возможности индивидов и их предпочтения. Например, долгое время такие поведенческие паттерны упорядочивались и согласовывались ценностями религии, которая больше всего влияла на развитие культуры. В динамическом аспекте культура рассматривается как совокупность поведенческих паттернов, которые формируются эволюционно и усваиваются (принимаются) акторами в процессе социализации. Наборы (совокупности) поведенческих паттернов могут варьироваться в рамках одной культуры или использоваться акторами избирательно в ходе адаптации к экзогенным вызовам или шокам и эндогенным инкрементным изменениям.
Восприятие культуры и поведенческих паттернов: трудности
перевода
Какое значение имеет для экономистов изучение культуры? Ответ на этот вопрос зависит от нашего понимания культуры и институтов и их влияния на экономическое развитие. Также важным представляется вопрос: чем могут быть полезны исследования культуры в плане понимания фундаментальных экономических явлений? В данной статье мы предлагаем теоретическую рамку для исследования культуры через идентификацию и описание поведенческих паттернов в историческом и национальном контекстах эволюции хозяйственных порядков.
Культуру индивиды воспринимают через призму поведенческих паттернов. Поведенческие паттерны многообразны, и восприятие их акторами во многом субъективно. Построение всеобъемлющей и полной классификации таких образцов поведения представляется невыполнимой и, возможно, ненужной задачей. Описанием поведенческих паттернов занимаются историки, например, описывая повседневную жизнь во времена Ренессанса и Просвещения (История частной жизни, 2016), социальные антропологи, в частности, представители сравнительного нового научного направления экономической антропологии (Blim, 2005), политологи (Макаренко, 2013). или идеологических доктрин выбор акторов приводит к временным равновесиям, о которые можно рассматривать в рамках стабильных/нестабильных социальных < порядков. Однако такие временные равновесия разрушаются в ходе социальной ее
эволюции. Институциональные изменения можно рассматривать как непрерывный процесс взаимоприспособления действий агентов к меняющимся условиям с учетом имеющихся культурных (социальных) ценностей, институтов, поведенческих паттернов. Именно взаимодействие акторов в рамках существующих структур выявляет конфликты по отношению к доминирующим культурным ценностям и поведенческим паттернам, что служит источником институциональных изменений (Dolfsma and Verburg, 2008).
Роль хороших институтов в государственном управлении отмечается в большом количестве современных работ, посвященных институциональным изменениям (Acemoglu and Robinson, 2012, Норт, 1997; 2010) Однако остается открытым вопрос, как хорошее управление и институты связаны с характеристиками граждан, составляющих общество. 1995) и адаптируются к изменениям, интерпретируя в ходе социальных взаимодействий существующие институты, правила, привычки, поведенческие — паттерны и создавая новые.
Связь между поведенческими паттернами и привычками может быть проиллюстрирована примерами наших повседневных решений, связанных с выбором, как добираться из дома на работу и обратно. Если у нас сформировалась привычка использовать личный автомобиль, мы сделуем одному паттерну, если общественный транспорт — другому (Brette et al, 2014. Р. 406). В свою очередь наши привычки зависят от институтов, которые регулируют движение транспорта внутри
о
ГО
ш о
off города.
5 Изменение поведенческих паттернов связано еще и с технологическими
факторами. Эмпирические исследования поведенческих паттернов в контексте культуры
g должны учитывать сложности, возникающие при кросскультурном сравнении F фундаментальных социальных ценностей и институтов. Возникающая проблема t может быть охарактеризована как «трудности перевода» ценностей и институтов
I—
со одной культуры для релевантного понимания в рамках другой.
— Поведенческие паттерны, как и социальные ценности, нельзя рассматривать
о вне культурного и языкового контекстов. Более того, само восприятие индивидами
< ценностей, институтов, привычек и устойчивых поведенческих шаблонов происходит
сс через специфический для данного общества, организации или социальной группы
00
дискурс. Поэтому любая классификация и сравнение ценностей связаны с «трудностями перевода». Однако это не значит, что такие сравнения невозможны. Наряду с компаративистскими исследованиями ценностей необходимо проводить качественные исследования дискурсов, нарративов для лучшего понимания правил, интенций, стимулов и контекстов, которые воспринимаются индивидами как релевантные в тех или иных временных, пространственных и культурных рамках.
Например, в рамках европейской и китайской культур существует разное понимание концепта «эффективности». Вместо характерного для европейской традиции понимания эффективности как построения идеальной формы (образца действия) и затем проецирования на реальные вещи, в китайском понимании чтобы достигнуть желаемого эффекта, следует рассчитывать скорее на развитие событий, чем на свой собственный инструментарий. Вместо того, чтобы думать о выстроенном заранее плане действий, лучше научиться извлекать пользу из того, что заложено в ситуации и что вытекает из ее развития (Жульен, 1999). опыт осмысливается ими с использованием индуктивного мышления (Arthur, 1994). о Он формирует поведенческие паттерны, которые используются для определенного < структурирования социальной реальности. Для обеспечения регулярности о;
х
пз ш
о <
структурированных социальных взаимодействий необходимо существование встроенных эволюционных механизмов, «регулирующих» частоту возникновения релевантных и нерелевантных моделей поведения и, следовательно, локальных правил, этических (нравственных) норм и институтов (Вольчик, 2014). Культура и социальные ценности выступают инструментом, согласовывающим такую взаимоадаптацию и обеспечивающим устойчивость социального порядка.
Исследование культуры и поведенческих паттернов в рамках хозяйственных порядков может быть основано на концепте индуктивного мышления. Использование индуктивного мышления в адаптивно-сложных системах не дает гарантии нахождения единственно верных равновесных стратегий поведения, но позволяет идентифицировать реально используемые акторами поведенческие паттерны в их разнообразии и исторической и культурной ускоренности. Опыт, знания культурных контекстов и индуктивное мышление, которые позволяют акторам принимать решения в адаптивно-сложных системах, также могут быть полезны экономистам в теоретических и эмпирических исследованиях эволюции хозяйственных порядков.
СПИСОК ЛИТЕРАТУРЫ
со Бергер П. и Лукман Т. (1995). Социальное конструирование реальности. М.:
о Медиум.
™ Бёгельсдейк Ш. и Маселанд Р. (2016). Культура в экономической науке:
история, методологические рассуждения и области практического применения в современности. СПб: Изд-во Института Гайдара.
Вольчик В. В. (2008). Эволюция институтов постиндустриальной экономики в контексте дихотомии Веблена // TERRA ECONOMICUS, Т. 6, № 2, с. 53-65.
Вольчик В. В. (2014). Индуктивное мышление и экономическое поведение // Журнал институциональных исследований, Т. 6, № 3, с. 6-13.
Вольчик В. В. и Бережной И. В. (2012). Отбор и экзаптация институтов: роль
ш групп и специальных интересов / Эволюционная и институциональная <
00
5 О
го
экономическая теория дискуссии, методы и приложения. Санкт-Петербург, с. 165187.
Вольчик В. Т. 12, № 3, с. 15-53.
о Ефимов В. М. (2011б). Дискурсивный анализ в экономике: пересмотр
s методологии и истории экономической науки (часть 2) // Journal of Economic 5 Regulation (Вопросы регулирования экономики), Т. 2, № 3. с. 5-79.
Жюльен Ф. (1999). Трактат об эффективности. СПб.: Изд-во «Университ.
о. книга».
¡2 Инглхарт Р. и Вельцель К. (2011). Модернизация, культурные изменения и
о демократия. М.: Новое издательство.
История частной жизни: под общей ред. Ф. Арьеса и Ж. Дюби. Т. 3: от Ренессанса до эпохи Просвещения; под ред. Р. Шартье. М.: Новое литературное обозрение, 2016.
Макаренко В. Расков Д. Е. (2012). Экономические институты старообрядчества. СПб.: Изд-
о во С.-Петерб. ун-та.
со ■н о см
о с
00
Тамбовцев В. Л. (2014). Экономическая теория неформальных институтов. M.: РГ-Пресс.
Этциони А. (2002). Социоэкономика: дальнейшие шаги // Экономическая социология, Т. 3, № 1.
Acemoglu D. and Robinson J. (2012). Why nations fail: The origins of power, prosperity, and poverty. Crown Business.
Akerlof G. A. and Snower D. J. (2016). Bread and bullets // Journal of Economic Behavior & Organization, no. 126, pp. 58-71.
Alesina A. and Giuliano P. (2015). Culture and institutions // Journal of Economic Literature, vol. 53, no. 4, pp. 898-944. doi:10.1257/jel.53.4.898.
Arthur W. B. (1994). Inductive reasoning and bounded rationality // The American economic review, vol. 84, no. 1, pp. 406-411.
Blim M. (2005). Culture and Economy. A Handbook of Economic Anthropology. doi:10.4337/9781845423469.00033.
Bowles S. (2016). The Moral Economy. Why Good Incentives Are No Substitute for Good Citizens. New Heaven; London: Yale University Press.
Brette O., Buhler T., Lazaric N. and Marechal K. (2014). Reconsidering the nature and effects of habits in urban transportation behavior // Journal of Institutional Economics, vol. 10, no. 3, pp. 399-426. doi: 10.1017/S1744137414000149.
Bush Paul D. (1987). The Theory of Institutional Change // Journal of Economic Issues, vol. 21, no. 3, pp. 1075-1116. doi: 10.1080/00213624.1987.11504697.
Camerer C. F. and Fehr E. (2006). When does» economic man» dominate social behavior? // Science, vol. 311, no. 5757, pp. 47-52.
Dolfsma W. and Verburg R. (2008). Structure, Agency and the Role of Values in Processes of Institutional Change // Journal of Economic Issues, vol. 42, no. 4, pp. 1031- > 1054. doi: 10.1080/00213624.2008.11507201. •
Field A. J. (2007). Beyond foraging: behavioral science and the future of institutional economics // Journal of Institutional Economics, vol. 3, no. 3, pp. 265-291. I doi: 10.1017/S1744137407000720. g
Hamilton D., Tool M. R., Tilman R., Phillips R. J., Troub R. M., Boulding K.
Мoscow, New Literary Review Publ. (In Russian). o
Acemoglu D. and Robinson J. (2012). Why nations fail: The origins of power, <
prosperity, and poverty. Crown Business. cc
38
BOAbHMK B. B.
Akerlof G. A. and Snower D. J. (2016). Bread and bullets. Journal of Economic Behavior & Organization, no. 126, pp. 58-71.
Alesina A. and Giuliano P. (2015). Culture and institutions. Journal of Economic Literature, vol. 53, no. 4, pp. 898-944. doi:10.1257/jel.53.4.898.
Arthur W. B. (1994). Inductive reasoning and bounded rationality. The American economic review, vol. 84, no. 1, pp. 406-411.
Berger P. L. and Luckmann T. (1995). The Social Construction of Reality. A Treatise on sociology of Knowledge. Moscow, Medium Publ. (In Russian).
Beugelsdijk S. and Maseland R. (2016). Culture in Economics: History, Methodological Reflections, and Contemporary Applications. St. Petersburg, Publ. House of the Gaidar Institute. (In Russian).
Blim M. (2005). Culture and Economy. A Handbook of Economic Anthropology. doi:10.4337/9781845423469.00033.
Bowles S. (2016). The Moral Economy. Why Good Incentives Are No Substitute for Good Citizens. New Heaven; London, Yale University Press.
Brette O., Buhler T, Lazaric N. and Marechal K. (2014). Reconsidering the nature and effects of habits in urban transportation behavior. behavior? Science, vol. 311, no. 5757, pp. 47-52.
Dolfsma W. and Verburg R. (2008). Structure, Agency and the Role of Values in s Processes of Institutional Change. Journal of Economic Issues, vol. 42, no. 4, pp. 1031° 1054. doi: 10.1080/00213624.2008.11507201.
® Etzioni А. (2002). Socio-Economics: the Next Steps. Journal of Economic
Sociology, vol. 3, no. 1. (In Russian).
Field A. J. (2007). Beyond foraging: behavioral science and the future of institutional economics. Journal of Institutional Economics, vol. 3, no. 3, pp. 265-291. doi: 10.1017/S1744137407000720.
Hamilton D., Tool M. R., Tilman R., Phillips R. J., Troub R. M., Boulding K. E., Culbertson Jr. W. P. and Breit W. (1977). Science and Ceremony: The Institutional Economics of C. Don, March Publ. (In Russian).
g North D. (1997). Institutions, Institutional Change and Economic Performance.
F Moscow, «Fund Economic Book Beginnings». (In Russian).
t North D. (2010). Understanding the Process of Economic Change. Moscow, Publ.
co House of the Higher School of Economics (State University). (In Russian). — Oleinik A. (2012). Institutional Transfers in the Russian System of Higher
o Education: A Case Study. Journal of Economic Issues, vol. 46, no. 4, pp. 881-908. doi: < 10.2753/JEI0021-3624460403.
cc Raskov D. E. (2012). The Economic Institutions of the Old Believers. St.
o Petersburg: Publishing House St. Petersburg. University. (In Russian).
Simon H. A. (1993). Altruism and Economics (in The Economics of Altruism). The American Economic Review. Papers and Proceedings of the Hundred and Fifth Annual Meeting of the American Economic Association. (May, 1993), vol. 83, no. 2, pp. 156-161.
Stiglitz J. (2015). The great divide. Penguin UK.
Tambovtsev V. L. (2014). Economic Theory of Informal Institutions. Moscow, RG-Press. (In Russian).
Volchik V. V. (2008). Postindustrial Economy Institutions Evolution in Context of Veblen’s Dichotomy. TERRA ECONOMICUS, vol. 6, no. 2, pp. 53-65. (In Russian).
Volchik V. V. (2014). Inductive Reasoning and Economic Behavior. Journal of Institutional Studies, vol. 6, no. 3, pp. 6-13. (In Russian).
Volchik V. V. and Berezhnoy I. V. (2012). Selection and Exaptation of Institutions: the Role of Groups and Special Interests / Evolutionary and Institutional Economics discussion, Methods and Applications. St. Petersburg, pp. 165-187. (In Russian).
Volchik V. V. and Posukhova O. Yu. (2016). Precarity and Professional Identity in the Context of Institutional Change. TERRA ECONOMICUS, vol. 14, no. 2, pp. 159173. (In Russian).
Yefimov V. M. (2011a). Discourse Analysis of the Economy: Review of the Methodology and the History of Economic Science (Part 1). Journal of Economic Sociology, vol. 12, no. 3, pp. 15-53. (In Russian).
Yefimov V. M. (2011b). Discourse Analysis of the Economy: Review of the Methodology and the History of Economic Science (Part 2). Journal of Economic Regulation, vol. 2, no. 3, pp. 5-79. (In Russian).
CO ■H
о см
о с
00
о >
x
te ш
о <
(D <
О
о
X -О х
-О
<
пз х О
< пз
>у
Ш Ш
ш <
о
I— 3 Ь; I—
ш
LL
о <
СП 3
о
НОУ ИНТУИТ | Лекция | Поведенческие шаблоны проектирования
Аннотация: Шаблоны проектирования, которые мы рассмотрим сегодня, определяют эффективные способы взаимодействия различных объектов в системе. Речь пойдет о поведенческих паттернах. Эта группа по своей значимости, распространенности и используемым механизмам схожа со структурными шаблонами, но при этом имеет собственную специфическую ценность, определяемую в контексте архитектуры программного обеспечения.
Введение
Поведенческие шаблоны проектирования определяют общие закономерности связей между объектами, реализующими данные паттерны. Следование этим шаблонам уменьшает связность системы и оптимизирует взаимодействие между объектами, что приводит к улучшению гибкости, надежности и сопровождаемости программного продукта.
Поведенческие шаблоны, как и все паттерны проектирования в целом, составляют собой библиотеку практических приемов, подкрепленных теоретическим базисом сферы информационных технологий. Они не являются абстрактным знанием, а служат утилитарным целям и могут приносить достаточную ценность при их последовательном, постоянном и грамотном применении.
Шаблоны проектирования поведения объектов
В поведенческих шаблонах, как и в смежных им структурных шаблонах, используется наследование, в качестве инструмента определения поведения для различных классов, и композиция, как уравнитель и распределитель выполняемых ими обязанностей.
Некоторые из тех, что мы рассмотрим далее, описывают, как с помощью взаимодействия наборы равноправных объектов работают над заданием, которое они не могут выполнить по отдельности. Ключевым моментом в таком подходе является осведомленность объектов о существовании друг друга. «Коллеги» должны хранить ссылки друг на друга, но это усиливает степень связанности системы. При высокой связанности каждому объекту пришлось бы иметь информацию обо всех остальных.
Поведенческие шаблоны проектирования решают задачи, обозначенные выше, и оптимизируют общую производительность системы.
Интерпретатор
Когда необходимо разрабатывать и поддерживать одну и ту же часто встречающуюся, подверженную изменениям задачу, это приводит к тому, что сопровождать логику приложения с большим количеством изменений затруднительно.
В этом случае целесообразно разработать шаблон «Интерпретатор», который решает данную задачу.
«Интерпретатор» (англ. Interpreter) – поведенческий шаблон проектирования, решающий часто встречающуюся, но подверженную изменениям задачу. Также известен как Little (Small) Language.
Как уже было обозначено, данный шаблон проектирования применяется для решения задач часто повторяющихся операций. Несмотря на то, что реализация этого паттерна требует понимания теории формальных языков и грамматик, он не сложен в восприятии и дальнейшей трактовки. Для его разработки потребуются следующие участники:
- Абстрактное выражение.
- Определяет интерфейс выражения, объявляет метод шаблона.
- Терминальное выражение.
- Реализует методы. Для каждого объекта создается свое терминальное выражение.
- Нетерминальное выражение.
- Представляет правило. Для каждого отдельного правила создается свой объект нетерминального выражения.
- Контекст.
- Содержит общую информацию. Может использоваться объектами терминальных и нетерминальных выражений для сохранения состояния операций и последующего доступа к сохраненному состоянию.
- Клиент.
- Управляет выполнением бизнес-логики в виде абстрактного синтаксического дерева, узлами которого являются объекты терминального и нетерминального выражения.
- Методы «Интерпретатора» в нетерминальных выражениях позволяют реализовать правила. При этом мы легко можем добавить новые правила, определив новые объекты нетерминального выражения со своей реализацией метода шаблона. Однако недостаток данного шаблона заключается в том, что он подходит только для тех случаев, когда правила относительно просты и не содержат большого количества ответвлений. В более сложных случаях следует выбирать другие способы проектирования приложения.
Жизненной аналогией этого шаблона является мясорубка, которая способна по определенным правилам преобразовывать небольшой входной набор кусков различного мяса к определенному виду фарша (разного состава). Такая мясорубка является достаточно надежным и универсальным инструментом, если на вход ей не подавать что-то совсем плотное и жесткое.
Рис. 6.2.1. Шаблон «Интерпретатор»
Итератор
В тех случаях, когда требуется, чтобы сложный составной объект, например список, предоставлял доступ к своим элементам (объектам), не раскрывая их внутреннюю структуру, причем перебирать список требуется по-разному в зависимости от задачи, применяется шаблон «Итератор».
В качестве основного назначения паттерна следует выделить:
- предоставление способа последовательного доступа ко всем элементам составного объекта, не раскрывая его внутреннего представления.
- Реализация шаблона должна иметь абстракцию, позволяющую разделить классы коллекций и алгоритмов.
Таким образом, данный паттерн используется, когда необходим механизм «абстрактного» обхода различных структур данных так, чтобы были определены алгоритмы, способные взаимодействовать со структурами прозрачно. Если раскрыть тему реализации и возможностей этого шаблона, то следует сказать о том, что любой составной объект, такой как список, должен предоставлять способ доступа к его элементам без раскрытия своей внутренней структуры. Иногда это является не просто вариантом использования структуры данных, а нужно перебирать элементы списка различными способами, в зависимости от конкретной задачи, а иногда нужно иметь несколько активных обходов одного списка одновременно. Идеальным решением в таком случае является единый интерфейс для обхода разных типов составных объектов. Именно подобная функциональность работы с комплексными объектами осуществляется с помощью паттерна «Итератор». Ключевая идея состоит в том, чтобы ответственность за доступ и обход переместить из составного объекта на сам итератор, который будет определять стандартный протокол обхода.
Алгоритм реализации данного шаблона предписывает следующие стадии:
- Создается определенный класс («Итератор»), который определяет интерфейс для доступа и перебора элементов.
- Конкретный экземпляр класса «Итератор» реализует его интерфейс и следит за текущей позицией при обходе агрегата.
- Агрегат определяет интерфейс для создания объекта-итератора.
- Конкретный экземпляр агрегата реализует интерфейс создания итератора и возвращает экземпляр его класса.
- Конкретный итератор отслеживает текущий объект в агрегате и может вычислить следующий объект при переборе.
Таким образом, из коллекции данных «выносится» функциональность обхода элементов и ей придается статус объекта. Это приводит к тому, что:
- упрощается коллекция данных;
- появляется возможность одновременно создавать множество активных обходов;
- алгоритмы обработки становятся отделены от структур данных.
Каждому классу рекомендуется иметь итератор. В том случае, когда потребуется дополнительная функциональность, если «Итератор» первоначально был предусмотрен, то можно будет добавить необходимую функциональность достаточно простои быстро, без изменений первоначального кода программы.
Аналогией этого шаблона является алфавитный библиотечный указатель, который предоставляет своему потребителю возможность быстро изучить структуру его элементов и при необходимости получить к ним доступ, но не предоставляет сами элементы, а только ссылки на них.
Рис. 6.2.2. Шаблон «Итератор»
Команда (Транзакция)
Когда необходимо послать объекту запрос, не зная о том, выполнение какой операции запрошено и кто будет получателем, целесообразно применять шаблон «Команда». Основополагающая идея данного шаблона заключается в использовании единого интерфейса для описания всех типов операций, которые можно производить с системой. Для добавления в систему поддержки новой операции достаточно реализовать требуемый интерфейс. Каждая операция представляется самостоятельным объектом, инкапсулирующим некоторый набор дополнительных свойств.
В этом шаблоне алгоритм представления бизнес-логики организован в виде последовательности процедур, которые управляют каждая своим запросом. Любое приложение можно представить в виде набора транзакций. Какие-то из них выбирают данные, какие-то – меняют. Каждое взаимодействие пользователя и системы содержит определенный набор действий. Паттерн «Команда» организует всю используемую логику в одну «над» -процедуру, работая сданными напрямую или через тонкую обертку.
При реализации шаблона «Команда» следует обратить внимание на следующие моменты:
- Насколько «умной» должна быть «Команда». У «Команды» может быть широкий круг обязанностей. С одной стороны, простое определение связи между получателем и действиями, которые нужно выполнить для удовлетворения запроса, с другой – независимая команда, т.е. реализация всего самостоятельно, без обращения за помощью к получателю. Последний вариант полезен, когда вы хотите определить команды, не зависящие от реализованных в системе классов, когда подходящего получателя не существует или когда получатель команде точно не известен.
- Поддержка отмены и повтора операций. Команды могут поддерживать отмену и повтор операций, если имеется возможность отменить результаты выполнения. Как правило, вся необходимая для этого информация сохраняется, в том числе:
- объект-получатель, который выполняет операции в ответ на запрос;
- аргументы операции, выполненной получателем;
- Исходные значения различных атрибутов получателя, которые могли измениться в результате обработки запроса.
Получатель должен предоставить операции, позволяющие команде вернуться в исходное состояние. Для поддержки всего одного уровня отмены приложению достаточно сохранять только последнюю выполненную команду. Если же нужны многоуровневые отмена и повтор операций, то придется вести список истории выполненных команд. Максимальная длина этого списка определяет число уровней отмены и повтора. Проход по списку в обратном направлении и откат результатов всех встретившихся по пути команд отменяет их действие. Проход в прямом направлении и выполнение встретившихся команд приводит к повтору выполнения действий.
- Накопление ошибок в процессе отмены. При выполнении, отмене и повторе команд иногда накапливаются ошибки, в результате чего состояние приложения оказывается отличным от первоначального. Поэтому порой необходимо сохранять в команде больше информации, дабы гарантировать, что объекты будут целиком восстановлены.
Известно большое количество задач, где подход к их решению задан с помощью шаблона «Команда»:
- Любое приложение c возможностями отмены или повторения действий (undo/redo) пользователя.
- Сетевые распределенные системы, использующие запросы в виде объектов в качестве основного примитива инициализации каких-либо операций.
- Системы с поддержкой асинхронных вызовов, инкапсулирующие обратный вызов в виде опроса объекта.
Перечислять такие задачи можно бесконечно, важно понять, что шаблон «Команда»– один из самых распространенных шаблонов проектирования. Аналогией данного шаблона является полет на борту самолета. После того как самолет взлетел, есть только два возможных дальнейших пути–попасть в точку назначения или вернуться в точку вылета. Все остальные действия, которые проходят по ходу полета,не рассматриваются в отрыве от самого перелета и являются необходимыми составляющими для его завершения.
Как распознать и изменить токсичные поведенческие паттерны
Паттерны обычно включают в себя повторяющиеся действия, задачу или поведение, которыми часто занимаются, часто даже не задумываясь. В большинстве случаев повседневное поведение происходит автоматически, это действие выполняется столько раз, что кажется комфортным и в нем нет никакого вреда. Или это поведение, которое мы не хотим менять из-за связанной с ним награды. Токсичные поведенческие паттерны также часто являются автоматическими, не обязательно представляют собой вредные по своей природе, и они с большей вероятностью сохранятся из-за соответствующего вознаграждения.
Некоторые модели вызывали проблемы в прошлом, в настоящее время способствуют возникновению проблем дома, на работе или где-либо еще, но их может быть трудно распознать и изменить. И необходимо уметь распознавать токсичные поведенческие паттерны, прежде чем решать, как их остановить и изменить.
Даже когда мы распознаем токсичное поведение, мы все равно не хотим меняться. Мы можем захотеть измениться, но по-прежнему опасаемся этого. Преодоление страха перед неизвестным может стать непреодолимым препятствием.Слышать от других, что перемены — это хорошо, и их следует принять, мало помогает уменьшить такой страх. Правда в том, что преодоление страха — это исключительно личный процесс.
Тем не менее, прислушиваясь к рекомендациям других о том, что сработало для них эффективно, может быть очень полезно для мотивации тех, кто сопротивляется переменам, заняться самосовершенствованием. В самом деле, иногда истинные изменения могут начаться только после того, как услышат такую поддержку.
Итак, распознавание токсичных поведенческих моделей — это первый шаг, который нужно сделать, прежде чем что-либо с ними делать.Распознав закономерности, легче принимать обоснованные решения о том, что делать в будущем.
Что представляет собой узор?
Как узнать, что какое-то личное действие является частью общей модели поведения? Это включает в себя отстраненность, отступление и наблюдение за поведением глазами других. Есть еще и непривязанность, которая приходит со временем. Когда с последнего поведенческого инцидента прошли месяцы или годы, легче понять, где и как такое поведение превратилось в токсичный паттерн.
Хотя отстранение сложно тренировать, есть более простые способы научиться различать паттерны.
Это привычка или шаблон? Несколько примеров могут быть полезны. Если вы делаете что-то каждый день автоматически, это, вероятно, привычка. Это может быть чашка горячего кофе при пробуждении или латте во время обеда или перерыва.
Конечно, прошлые привычки — это вещи, о которых вы очень хорошо знаете, например, пристрастие к наркотикам и алкоголю, которые переросли в злоупотребление психоактивными веществами и, возможно, зависимость или расстройство, связанное с употреблением алкоголя.Это происходило не изредка. Так было постоянно, и эта привычка захватила вашу жизнь до такой степени, что вы почувствовали, что не можете существовать без нее. Или вы можете быть почти алкоголиком и хотите изменить это токсичное поведение.
Например, когда кто-то выходит из кайфа, вызванного алкоголем или наркотиками, их привычка к употреблению требует определенного поведения, когда им нужно искать наркотик, который они хотят использовать снова. Затем узор укоренился. Человек сделал это, потому что он должен был, потому что не было другого способа удовлетворить их постоянную потребность и желание использовать.
В итоге, закономерность — это поведение, к которому мы возвращаемся раз за разом, и которое мы делаем, не обязательно задумываясь. Когда дело доходит до распознавания закономерностей, важно выяснить, как устранить те, которые приводят к негативным последствиям, и принять те, которые оказываются полезными для благополучия.
Хорошие новости, плохие новости
Может быть шоком осознать, что то, что, по вашему мнению, было хорошо для вас, на самом деле прямо противоположное. В этом признании есть хорошие и плохие новости.С одной стороны, вы знаете, что то, что вы считали хорошим, возможно, вы заставили поверить. Может быть, вы думали, что это будет хорошо для вас, потому что это хорошо для кого-то другого, и вы приняли такое поведение в надежде, что у вас будет такой же успех.
Слепая приверженность какой-либо идее никогда не бывает мудрой. Требуется тщательное обдумывание заранее и тщательный анализ после этого, чтобы определить, подходит ли вам модель поведения.
С чего начать
Рассмотрите возможность составления списка текущего поведения, составляющего шаблон.Это помогает делать заметки, которые можно использовать позже в качестве справки.
Сделайте два отдельных листа, по одному на каждый образец хорошего и плохого поведения. Или просто составьте список моделей поведения и посмотрите, соответствуют ли они шаблонам. Затем присвойте им положительное или отрицательное значение.
Это значение означает не то, нравится вам поведение или нет. Тебе нравилось кайфовать, верно? Это не означало, что это был положительный образец поведения. Нет, здесь положительное или отрицательное значение относится к тому, улучшает оно или ухудшает вашу жизнь.
Пример токсичного поведения — слишком много на работе. Хотя, конечно, нет ничего плохого в желании позаботиться о своей семье и своих обязанностях, но когда вы постоянно берете на себя новые задания, просите больше ответственности на работе и пренебрегаете другими аспектами своей жизни, это красный флаг, который должен сигнализировать о проблемах. предстоящий.
Может быть, вы раньше не были трудоголиком, но такая модель поведения является симптоматикой характеристик трудоголика.Когда все ваше время занято работой и связанными с ней задачами, остается мало времени на что-то еще. В результате повышается уровень стресса, нарастает напряжение и снижается продуктивность. Работать усерднее и дольше становится все меньше.
Кому обращаться
Когда у вас есть список шаблонов, особенно тех, которые вы хотите изменить, что с ним делать? К кому лучше всего обратиться за помощью во всем этом?
Есть несколько предложений, любое из которых или все могут быть подходящими для вашей ситуации.
- Ваш супруг (а) или близкие — Ваш супруг (а) и / или близкие и члены семьи — это логичный первый выбор здесь. Это люди, которые знают вас больше всего и заботятся о вас. Они должны максимально поддерживать ваши усилия и могут принимать непосредственное участие в некоторых моделях поведения, которые вы хотите изменить.
- Ваш терапевт — Обязательно воспользуйтесь возможностью обсудить со своим консультантом или терапевтом виды поведения, которые вы хотите изменить.Как объективный профессионал, терапевт может лучше указать на наблюдения по поводу определенных форм поведения, о которых вы, возможно, не задумывались, или провести параллели с другими ранее обсуждавшимися формами поведения. Консультации также носят конфиденциальный характер, что должно развеять опасения.
- Ваш начальник. В некоторых случаях изменение моделей поведения потребует от вас определенных обсуждений со своим начальником или руководителем на работе. Очевидно, вам следует очень тщательно обдумать, как вы подходите к этому человеку, включая то, что, когда и где вы планируете такое обсуждение.Имейте в виду, что ваш работодатель хочет, чтобы вы работали как можно более продуктивно, поскольку это бизнес, и для его успеха требуется продуктивность. Сосредоточьте свое обсуждение на том, как вы можете удовлетворить свои потребности и что вы можете сделать, чтобы помочь.
Встреча с сопротивлением
Что делать, если вы не можете продвинуться вперед из-за сопротивления? Некоторые токсичные поведенческие паттерны невозможно устранить в одночасье. Признание того, что нужно изменить, имеет решающее значение, но до того, как это произойдет, еще далеко.
Наберитесь терпения. Будьте готовы выполнять работу и не разочаровывайтесь и не расстраивайтесь, когда что-то не разрешается сразу. Жизнь может быть запутанной, сложной и трудной для понимания. Это еще одно преимущество поддержки сильной сети поддержки, когда есть люди, к которым можно обратиться в трудную минуту.
Также важно понимать внутреннее сопротивление переменам.
Празднуйте успех
Также невероятно ценно отмечать небольшие успехи после внесения этих важных изменений.
Помните, что не каждое изменение будет потрясающим. Это не обязательно, чтобы считаться успехом. Если это важно для вас, важно для вашего благополучия.
Признайте свои достижения. Отдайте себе должное за то, что вы сделали, а затем посмотрите на следующий пункт в списке и вернитесь к работе. Успех строится на успехе. С инерцией легче двигаться вперед.
Шаблон поведенческого дизайна (Что это такое?)
Урок 2 | Что такое поведенческий паттерн? |
Цель | Определить шаблоны поведения |
Что такое шаблон проектирования поведения?
Образец поведения объясняет, как взаимодействуют объекты.Кроме того, этот шаблон описывает, как разные объекты и классы отправляют друг другу сообщения, чтобы что-то происходило и как шаги задачи распределяются между разными объектами. Где- шаблоны создания в основном описывают момент времени (момент создания), а
- структурные шаблоны описывают более или менее статичную структуру,
- поведенческих паттернов описывают процесс или поток.
Шаблоны поведенческих классов
Шаблоны поведенческих классов используют наследование, подклассы и полиморфизм для корректировки шагов, предпринимаемых во время процесса.Кроме того, шаблоны поведенческих классов сосредоточены на изменении точного используемого алгоритма или выполняемой задачи в зависимости от обстоятельств.
Шаблоны поведенческих объектов
Паттерны поведенческих объектов описывают, как разные объекты работают вместе для выполнения задачи. Паттерны поведенческих объектов решают задачи, которые было бы сложно или невозможно выполнить с помощью отдельных объектов. Более того, они, как правило, делают весь процесс проще, понятнее и надежнее, чем решения на основе веревки и троса, которые созданы без четкого проектирования.
В программной инженерии поведенческие шаблоны проектирования — это шаблоны проектирования, которые идентифицируют общие шаблоны взаимодействия между объектами и реализуют эти шаблоны. Поступая таким образом, эти паттерны повышают гибкость в проведении этого общения.
Примеры этого типа шаблона проектирования включают в себя:
- Схема цепочки ответственности: объекты команд обрабатываются или передаются другим объектам содержащими логику объектами обработки
- Шаблон команды: Объекты команды инкапсулируют действие и его параметры
- Внешний вид стека: Превратите рекурсивную функцию в итеративную, использующую стек.
- Иерархический шаблон посетителя: Обеспечивает способ посетить каждый узел в иерархической структуре данных, такой как дерево.
- Шаблон переводчика: Реализация специализированного компьютерного языка для быстрого решения определенного набора проблем
- Шаблон итератора: Итераторы используются для последовательного доступа к элементам агрегированного объекта без раскрытия его базового представления
- Шаблон посредника: Предоставляет унифицированный интерфейс для набора интерфейсов в подсистеме
- Образец воспоминания: Обеспечивает возможность восстановления объекта в его предыдущее состояние (откат)
- Нулевой шаблон объекта : предназначен для использования в качестве значения по умолчанию объекта
- Шаблон наблюдателя: также известный как публикация / подписка или прослушиватель событий.Объекты регистрируются для наблюдения за событием, которое может быть вызвано другим объектом
- Слабый эталонный образец: Отсоедините наблюдателя от наблюдаемого.
- Стек протоколов: Связь осуществляется на нескольких уровнях, которые образуют иерархию инкапсуляции.
- Шаблон запланированной задачи: Задача запланирована на выполнение с определенным интервалом или по времени (используется в вычислениях в реальном времени)
- Шаблон одноразового посетителя: Оптимизация реализации посетителя, который выделяется, используется только один раз, а затем удаляется
- Шаблон спецификации: Рекомбинантная бизнес-логика в булевой форме
- Шаблон состояния: Чистый способ частичного изменения типа объекта во время выполнения
- Шаблон стратегии: Алгоритмы выбираются на лету
- Шаблон метода шаблона: Описывает программный скелет программы
- Шаблон посетителя: Способ отделения алгоритма от объекта
Понимание шаблонов поведенческого проектирования | Слизистость
Добро пожаловать обратно в нашу серию шаблонов дизайна .В первой части этой серии мы обсудили шесть шаблонов структурного проектирования. Во второй части мы рассмотрим модели поведения. Паттерны поведения позволяют нашим объектам общаться друг с другом, будь то один к одному или многие к одному.
Шаблон делегирования
Я помню, как впервые услышал о делегате, представленном мне как способ разрешить объектам общаться друг с другом. Первоначальным препятствием, с которым я столкнулся при работе с делегатами, было различие между делегатами и протоколами.
Протокол — это набор требований, которые должен реализовывать каждый соответствующий ему тип. Протокол содержит детали декларации, а не детали реализации. Делегаты реализуются с использованием протоколов и полезны, потому что они устанавливают индивидуальный метод связи между объектами. (Следует отметить, что в ситуациях, когда одно закрытие может использоваться для передачи изменений в объект, делегатов может быть слишком много.)
Паттерн наблюдателя
В отличие от делегирования, этот шаблон позволяет нашим объектам взаимодействовать по принципу «один ко многим».Вот некоторые из обозревателей, используемых в iOS:
Центр уведомлений
Согласно Apple, этот собственный API — это механизм, который позволяет транслировать информацию зарегистрированным наблюдателям. Вам следует подумать об использовании этого API, если у вас есть несколько объектов, которым необходимо отслеживать одно и то же изменение, без прямого подключения этих объектов друг к другу. Также полезно, если это изменение нужно наблюдать неоднократно.
У использования этого шаблона есть несколько недостатков — например, нелегко отслеживать ошибки.В отличие от делегирования, уведомления и их наблюдатели имеют косвенное отношение. Это может затруднить отслеживание того, откуда приходит уведомление или где оно просматривается. Кроме того, объект, отправивший уведомление, и объекты, которые отслеживают изменения, должны знать об уведомлении , имя
и userInfo
. Кроме того, нет детерминированного порядка того, как объекты, слушающие изменения, получают эти уведомления.
Наблюдатели за ключевыми значениями
С помощью наблюдателей «ключ-значение» один тип может наблюдать свойства другого типа, чтобы узнать об изменениях в состоянии наблюдаемого типа.Эти типы наблюдателей могут обеспечить простой способ синхронизации информации между объектами и могут предоставить нам простой способ получить новое значение и предыдущее значение свойства.
Что дальше?
Это далеко не полный список моделей поведения, но это хорошее место для начала. В третьем и последнем выпуске этой серии, который выйдет в ближайшее время, мы рассмотрим шаблонов создания .
Шаблон поведенческого проектированияна C #
Назад к: Шаблоны проектирования на C # с примерами в реальном времени
Шаблон поведенческого проектирования на C #В этой статье я собираюсь дать краткое введение в шаблон поведенческого проектирования на C # .Прочтите нашу предыдущую статью, в которой мы обсуждали шаблоны проектирования конструкций в C # с примерами. В рамках этой статьи мы обсудим следующие три вещи.
- Что такое шаблон поведенческого дизайна?
- Когда использовать шаблон поведенческого дизайна?
- Примеры шаблонов поведенческого проектирования
Согласно Википедии, в области разработки программного обеспечения поведенческие шаблоны проектирования — это шаблоны проектирования, которые определяют общие шаблоны взаимодействия между объектами и реализуют эти шаблоны.Поступая таким образом, эти паттерны повышают гибкость в проведении этого общения.
Паттерны поведения — это паттерны, которые связаны с взаимодействием между объектами. Взаимодействие между объектами должно быть таким, чтобы они разговаривали друг с другом и при этом оставались слабосвязанными. Слабая связь — ключ к многоуровневой архитектуре.
Поведенческий образец объясняет, как взаимодействуют объекты. Он описывает, как разные объекты и классы отправляют друг другу сообщения, чтобы что-то произошло, и как шаги задачи распределяются между разными объектами.
Когда использовать поведенческие шаблоны проектирования в C #?В приложениях реального времени иногда мы хотим изменить поведение класса и опять же не хотим, чтобы это влияло на другие классы проекта. Например, у нас есть класс Invoice, в котором в настоящее время применяются налоги в размере 18%. Завтра, если мы хотим добавить еще один дополнительный налог. Это означает, что мы меняем поведение класса. Для решения такого типа поведенческих проблем в игру входит шаблон поведенческого дизайна.
Примеры шаблона проектирования поведения в C #:- Шаблон проектирования итератора
- Шаблон проектирования наблюдателя
- Шаблон проектирования цепочки ответственности
- Шаблон проектирования интерпретатора
- Шаблон проектирования команд
- Шаблон дизайна Memento
- Шаблон дизайна посредника
- Шаблон дизайна State
- Шаблон дизайна метода шаблона
- Шаблон дизайна стратегии
- Шаблон дизайна посетителя
В следующей статье , Я собираюсь обсудить шаблон проектирования Iterator в C # с некоторыми примерами.В этой статье я попытаюсь дать краткое введение в шаблон поведенческого проектирования . Надеюсь, вы поняли необходимость и использование шаблона проектирования Behavioral в C # .
Шаблон поведенческого проектирования из семейства шаблонов GoF
Поведенческий шаблон проектирования занимается взаимодействием между объектами класса. Они используются для определения присутствия уже существующих шаблонов общения и могут управлять этими шаблонами.Поведенческий шаблон — это шаблон проектирования, с помощью которого идентифицируются общие шаблоны взаимодействия между различными объектами. Таким образом, общение осуществляется более гибко.
Поведенческий шаблон дизайнаШаблоны в этой категории характеризуют способы взаимодействия классов или объектов и распределения ответственности. Эти шаблоны проектирования специально предназначены для связи между объектами. Итак, здесь вы узнаете, как использовать поведенческие шаблоны для упрощения сложного управления потоком.Кроме того, вы будете использовать поведенческие шаблоны для инкапсуляции алгоритмов и их динамического выбора во время выполнения.
Этот модуль исследует различные поведенческие паттерны проектирования, паттерны, которые описывают способ взаимодействия объектов и классов и разделения ответственности между собой. Поведенческий паттерн абстрагирует действие, которое вы хотите предпринять, от объекта или класса, который выполняет это действие. Изменяя объект или класс, вы можете изменить используемый алгоритм, затронутые объекты или поведение, сохранив при этом тот же базовый интерфейс для клиентских классов.
Хороший набор поведенческих шаблонов позволяет решать множество сложных проблем, с которыми вы, вероятно, столкнетесь при проектировании объектно-ориентированных систем. К ним относятся перечисление списков, реакция на изменения состояния объекта, сериализация и десериализация объектов без проникновения в инкапсуляцию данных.
В этом модуле вы узнаете:- Как программисты используют шаблоны поведенческого проектирования
- О наиболее часто используемых шаблонах проектирования
- Когда использовать шаблоны наблюдателя и посредника
- Как использовать шаблон Посредник для управления различными светофорами
Шаблоны поведенческих объектов используют композицию объектов, а не наследование.Некоторые из этих шаблонов описывают, как группа одноранговых объектов взаимодействует для выполнения задачи, которую ни один объект не может выполнить сам по себе. Важным вопросом здесь является то, как одноранговые объекты узнают друг о друге. Одноранговые узлы могли поддерживать явные ссылки друг на друга, но это увеличило бы их связь. В крайнем случае, каждый объект будет знать обо всех остальных. Шаблон «Посредник» позволяет избежать этого, вводя объект-посредник между одноранговыми узлами. Посредник обеспечивает косвенное обращение, необходимое для слабой связи.
Книга с выкройками Spring 5
Вы можете купить мою книгу Spring 5 с названием « Spring 5 Design Pattern ». Эта книга доступна на веб-сайте издателя Amazon и Packt . Изучите различные шаблоны проектирования , и , лучшие практики в Spring 5 и используйте их для решения общих проблем проектирования. Вы можете воспользоваться авторской скидкой для покупки этой книги, используя код — « AUTHDIS40 ». Паттерны в паттерне поведенческого дизайнаПаттерны в этой категории паттернов поведенческого проектирования характеризуют способы, которыми классы или объекты взаимодействуют и распределяют ответственность.Эти шаблоны проектирования специально предназначены для связи между объектами. Итак, здесь вы узнаете, как использовать поведенческие шаблоны для упрощения сложного управления потоком. Кроме того, вы будете использовать поведенческие шаблоны для инкапсуляции алгоритмов и их динамического выбора во время выполнения. В эту категорию входят следующие перечисленные шаблоны проектирования.
Цепочка ответственностиДля обработки запроса создается цепочка объектов, чтобы ни один запрос не возвращался невыполненным.
КомандаКомандный шаблон обрабатывает запросы, скрывая их внутри объекта как команду и отправляя ее в вызывающий объект, который затем передает ее соответствующему объекту, который может выполнить запрос.
ПереводчикШаблон интерпретатора используется для оценки языка или выражения путем создания интерфейса, который сообщает контекст для интерпретации.
ИтераторШаблон итератора используется для обеспечения последовательного доступа к числовым элементам, присутствующим внутри объекта коллекции, без какого-либо обмена соответствующей информацией.
Посредник Шаблон посредникаобеспечивает простую связь через свой класс посредника, который обеспечивает связь для нескольких классов.
ПамяткаЭтот шаблон включает работу трех классов Memento, CareTaker и Originator. Memento сохраняет восстанавливаемое состояние объекта. Работа создателя — создание и хранение состояний, а работа смотрителя — восстановление состояний памятных вещей.
Нулевой объектNull Object используется вместо указания значения Null и используется для представления конкретной операции, которая при создании ничего не делает.По сути, это проверка нулевого значения без наличия значения.
НаблюдательОтношение «один ко многим» требует, чтобы шаблон наблюдателя проверял относительные зависимости объектов.
ГосударствоВ шаблоне состояния поведение класса зависит от его состояния и, таким образом, представлено объектом контекста.
Стратегия Шаблон стратегииимеет дело с изменением поведения класса во время выполнения.Объекты состоят из стратегий, а объект контекста оценивает поведение каждой стратегии во время выполнения.
Шаблонный методОн используется с компонентами, имеющими сходство, где шаблон кода может быть реализован для тестирования обоих компонентов. Код может быть изменен с небольшими изменениями.
ПосетительПосетитель выполняет набор операций с классом элемента и изменяет его поведение выполнения. Таким образом, изменение поведения класса элемента зависит от изменения класса посетителя.
Краткое описание шаблонов проектирования — Часть III. Поведенческие модели. | Кшиштоф Кемпински | Блог разработчиков kkempin
Шаблоны проектированияЯ хочу показать вам простой каталог шаблонов проектирования для объектно-ориентированного программирования, которые описаны в замечательной книге Шаблоны проектирования. Элементы объектно-ориентированного программного обеспечения многократного использования .
В предыдущих частях этой серии я представил шаблоны создания и структурные шаблоны.
Поведенческие шаблоны говорят о том, как решаются проблемы и как распределяются обязанности между объектами. Они больше о коммуникации, чем о структуре.
Цепочка ответственности
Отделите отправителя запроса от его получателя, предоставив более чем одному объекту возможность обработать этот запрос.
Используется, когда : более одного объекта могут обрабатывать запрос, и эта информация известна во время выполнения.
Команда
Инкапсулирует запрос как объект.
Используйте, когда : у вас есть очередь запросов для обработки или вы хотите их зарегистрировать. Также, когда вы хотите выполнить действие «отменить».
Интерпретатор
Интерпретирует предложение на заданном языке, используя представление грамматики на этом языке.
Используйте, когда : вы хотите интерпретировать данный язык и можете представлять операторы как абстрактные синтаксические деревья.
Итератор
Обеспечивает способ последовательного доступа к элементам агрегированных объектов без раскрытия того, как они хранятся внутри.
Используйте, когда : вы хотите получить доступ к содержимому объекта, не зная, как он представлен внутри.
Посредник
Определите объект, который знает, как взаимодействуют другие объекты. Это способствует ослаблению связи, удаляя прямые ссылки на объекты.
Используется, когда : набор объектов взаимодействует сложным образом.
Memento
Захватить внешнее состояние объекта, если потребуется восстановить его без нарушения инкапсуляции.
Используйте, когда : вам нужно сделать снимок объекта.
Наблюдатель
Когда один объект меняет состояние, все его иждивенцы уведомляются об этом факте.
Используется, когда : изменение одного объекта требует изменения других.
Состояние
Объект может изменять свое поведение при изменении его внутреннего состояния. Похоже, объект меняет свой класс.
Используется, когда : поведение объекта зависит от его состояния, а его поведение во время выполнения зависит от этого состояния.
Стратегия
Позволяет алгоритму быть независимым от клиентов, которые его используют.
Используйте, когда : у вас есть много классов, которые различаются по своему поведению. Стратегии позволяют настроить класс с одним из множества вариантов поведения.
Шаблонный метод
Определите скелет алгоритма в операции, перенеся некоторые шаги на подклассы. Шаблонный метод позволяет подклассам переопределять определенные шаги алгоритма без изменения структуры алгоритма.
Используйте, когда : вы должны определить шаги алгоритма один раз и позволить подклассам реализовать его поведение.
Посетитель
Представляют операцию, которая должна быть выполнена над элементами конструкции. Он позволяет вам определять новые операции без изменения классов элементов.
Используйте, когда : структура объекта включает в себя множество классов, и вы хотите выполнить операции с элементами этой структуры, которые зависят от их классов.
Я написал сообщение в блоге о шаблоне посетителя в Ruby.
Как изменить свои мысли и модели поведения к лучшему
Автор: Jon Jaehnig
Обновлено 29 января 2021 г.
Медицинское заключение: Лорен Фоли
Если у вас есть мысли или модели поведения, которые, как вы знаете, являются нездоровыми или непродуктивными, или даже токсичными для вас самих и окружающих, изменить их может быть сложно.В конце концов, эти шаблоны — часть жизни. Решение о том, что вам нужно изменить свои мысли и модели поведения к лучшему, — огромный шаг, но он может заставить вас задуматься, с чего начать.
Понимание своих мыслей через внимательность
Источник: rawpixel.com
Чтобы изменить свои мысли, вам нужно понять, как работают ваши мыслительные процессы. Это звучит просто, но это немного сложнее, чем можно было ожидать.
Наш разум работает все время, как компьютер, а не только когда мы активно на что-то обращаем внимание или пытаемся что-то понять. Когда вы едете за рулем, принимаете душ, читаете или смотрите телевизор, ваш ум просто бешен. Сторонники осознанности называют это «обезьяньим умом».
Ваш мозг имеет тенденцию отключаться от обезьяньего разума, но он по-прежнему оказывает огромное влияние на то, как вы думаете и чувствуете. Может быть сложно научиться уделять больше внимания своему обезьяньему разуму, но это может помочь вам понять и активно изменить свое мировоззрение.
Один из лучших способов понять свой обезьяний разум — это процесс, называемый «медитацией осознанности». Это мысленное упражнение, обычно используемое для снижения стресса, также может помочь вам понять и изменить свои мысли и модели поведения.
Для начала сядьте или лягте удобно. Закрой глаза. Сосредоточьтесь на своем дыхании. Вам не нужно менять дыхание, чтобы сделать его глубже или медленнее, просто обратите внимание на то, как вы чувствуете дыхание, когда оно входит в ваше тело и выходит из него. Скорее всего, вы сможете сосредоточиться на своем дыхании только на несколько мгновений, прежде чем ваш обезьяний ум прервется.Это нормально. Просто запишите, о чем была мысль, и вернитесь к своему дыханию. Постарайтесь сделать это хотя бы пять минут. К концу своего времени вы, возможно, заметили тенденцию в мыслях, которые вас отвлекали. Постарайтесь выполнять это упражнение хотя бы раз в неделю, но работайте не менее пяти минут в день.
После того, как вы сделаете это какое-то время, вы должны больше осознавать, что ваш обезьяний разум говорит вам в течение дня. Если вы активно пытаетесь измениться к лучшему, вероятно, вас сдерживает обезьяний разум.Возможность его перехватить может помочь вам не допустить, чтобы он определял ваше поведение.
Понимание моделей вашего поведения с помощью ретроспективы
Ваш обезьяний разум может контролировать ваше поведение, но ваше поведение легче наблюдать, чем ваш обезьяний разум. Скорее всего, если вы в первую очередь заинтересованы в изменении своих мыслей и моделей поведения, возможно, именно ваше поведение дало вам понять, что что-то не так.
Наблюдение за своим поведением — это активное занятие, но оно не обязательно требует медитации.Просто нужно обращать внимание на то, что вы чувствуете своим поведением. Иногда поведение, которое вы хотите изменить, является привычкой. Это означает, что может быть трудно не сделать этого, даже если вы потом пожалеете об этом. Итак, относитесь к этому поведению так же, как вы относились к своим навязчивым мыслям в приведенном выше упражнении на осознанность. То есть не ругайте себя, просто обратите внимание на то, что они заставляют вас чувствовать, и посмотрите, какие тенденции вы можете заметить. Это может сделать две важные вещи.
Во-первых, он может помочь вам понять цепочки событий, которые могут привести к вашему нежелательному поведению или к отдельным событиям, которые могут вызвать такое поведение. Например, возможно, вы ведете себя нежелательно только тогда, когда находитесь с определенными людьми, или если вы пьете, или когда у вас был плохой день на работе. Как только вы распознаете вещи, которые приводят к вашему нежелательному поведению, вы можете обнаружить, что можете прервать цепочку событий.
Во-вторых, напоминание себе о негативных чувствах, которые вы испытываете после выполнения нежелательного поведения, может помочь вам избежать этого.Иногда мы знаем, что обсуждаем негативное поведение, но можем забыть о том, как это заставляет нас чувствовать себя позже. Напоминая себе о своем прошлом сожалении о своем поведении, прежде чем вы это сделаете, вы сможете убедить себя, что такое поведение того не стоит.
Понимание моделей вашего поведения через окружающих
Источник: pxhere.com
Иногда мы не понимаем, что не так в нашем поведении; мы знаем только то, что это вредит окружающим.В этом случае может быть сложно самостоятельно отслеживать свои модели поведения и чувства, как описано выше, но это не означает, что у вас нет надежды.
Если вы не понимаете, как ваше поведение вредит другим или даже какое поведение вызывает проблему, вы можете часто узнать об этом, спросив их. Это может показаться немного неловким, но если вы искренне относитесь к другим, когда спрашиваете их, они обычно поймут и дадут свой совет.
Если вы знаете, какое поведение хотите изменить, можно легко связаться с людьми, на которых оно влияет.Попробуйте начать разговор с чего-то вроде: «Я пытаюсь изменить X в себе, и я думаю, что мне будет легче, если я пойму, что это вызывает у других».
Если вы не знаете, какое поведение хотите изменить — вы просто знаете, что это должно быть изменение — может быть труднее найти людей, с которыми можно поговорить. Подумайте о том, чтобы начать с близких вам людей, например, членов семьи и коллег. Вам не нужно начинать с «признания» своего негативного поведения. Вместо этого вы можете начать разговор с чего-то вроде: «Я пытаюсь стать лучше, но не знаю, с чего начать.Есть ли что-то, что я говорю или делаю, что вас расстраивает? «
Это может показаться открытием для некоторых обидных отзывов. Столкновение с тем, что вам нужно изменить свое поведение, может быть трудным, но это путешествие, которое вы уже начали. Если вы честны с кем-то, когда просите его о помощи, он вряд ли воспользуется ею как предлогом, чтобы заставить вас чувствовать себя плохо. Постарайтесь помнить, что они заботятся о ваших интересах, даже если они дают обратную связь, которую трудно услышать.
Понимание ваших мыслей и моделей поведения посредством наблюдения
Понимание того, откуда берутся ваши мысли или модели поведения, может помочь вам изменить их к лучшему. Иногда мы не знаем, откуда берутся наши мысли или модели поведения. Однако в других случаях мы можем распознать наши негативные мысли или модели поведения в окружающих. Возможно, это люди, у которых мы их взяли. Иногда мы заимствуем негативное поведение от родителей, коллег или друзей.Часто мы понимаем, что вели себя неприемлемо, когда узнаем себя в ком-то другом.
Определение того, где вы заметили нежелательное поведение, может помочь вам понять, как его избежать, а также куда не обращаться за советом по его устранению.
Почему некоторые модели поведения трудно изменить
Даже если вы поймете, в чем заключается ваше негативное поведение, откуда оно взялось и что к нему приводит, может быть трудно изменить образ мышления и поведения.Причина этого может быть сложной, но есть несколько основных тенденций.
Некоторые модели мышления и поведения трудно изменить, потому что, даже если вы больше не хотите ими заниматься, они социально приемлемы — или даже поощряются. Яркие примеры включают такие вещи, как употребление алкоголя или психоактивных веществ, переедание и другие виды деятельности. Каким бы ни было поведение, оно, вероятно, поощряется в определенных условиях или социальных условиях. В этом случае вам может потребоваться удалить себя из этой среды или социальной группы, чтобы избежать побуждений к проявлению нежелательных мыслей или моделей поведения.
Источник: pexels.com
Некоторые паттерны негативного поведения могут поощряться вашим телом, что затрудняет их преодоление. Некоторые виды негативного поведения обычно заставляют нас чувствовать себя хорошо, потому что они основаны на здоровом поведении или имитируют его и сбивают с толку систему химического вознаграждения вашего тела. Если вы слишком часто допускаете такое поведение, ваше тело может ассоциировать его с гормонами хорошего самочувствия, что приведет к поведенческой зависимости, химически похожей на расстройство, вызванное употреблением психоактивных веществ.Это может иметь место при употреблении определенных продуктов, игре в видеоигры, сексе и других занятиях.
Если вам нужна помощь
Иногда, несмотря на все наши усилия и намерения, мы просто не в состоянии преодолеть свои нежелательные мысли или модели поведения. Образ мыслей может быть слишком глубоко укоренен в наших ментальных процессах, или поведение может быть слишком сильно врезано в наш центр вознаграждения. В этом случае вам может потребоваться помощь.
Источник: pexels.com
Можно начать с разговора со своим лечащим врачом, особенно если ваше поведение вредит вашему здоровью. Они смогут направить вас к ресурсам сообщества.
Другой вариант — обратиться к онлайн-группам поддержки, общественным центрам и местным службам психического здоровья. Многие нежелательные мысли и модели поведения встречаются чаще, чем мы думаем, и во многих сообществах есть группы поддержки для людей, которые их переживают.
Наконец, вы можете встретиться с психологом или терапевтом.Это может показаться пугающим и дорогостоящим. Однако поиск терапевта или консультанта в Интернете может помочь решить эти проблемы. Онлайн-терапевты и консультанты более доступны и удобны, чем личные встречи с консультантами или терапевтами.
Исследование показало, что онлайн-терапия может быть более личной, чем традиционная. Девяносто шесть процентов людей, использующих онлайн-терапию, сообщили, что чувствуют личную связь со своими онлайн-терапевтами, по сравнению с 91 процентом, которые обращались к терапевтам лицом к лицу.Они также больше вкладывались в выполнение домашних заданий, которые назначали им терапевты, и время от времени просматривали переписку между ними и их терапевтами, побуждая их двигаться вперед в своей жизни.
Как BetterHelp может вас поддержать
Если вы обнаружите, что снова возвращаетесь к старым образцам мышления и поведения, обратитесь в BetterHelp. Вам подберут лицензированного терапевта или консультанта, который научит вас методам борьбы с нежелательными мыслями и поведением и их изменения, предлагая эмоциональную поддержку и понимание.Вы сможете встретиться со своим онлайн-терапевтом, не выходя из дома и в удобное для вас время. Ниже приведены некоторые отзывы о консультантах BetterHelp от людей, испытывающих аналогичные проблемы.
Отзывы консультанта
«Доктор. Стритер прислушивается к моим опасениям, независимо от того, насколько они велики или малы, и помогает увидеть ситуации с других точек зрения. Они всегда предоставляют мне дополнительные ресурсы для исследования или предлагают способы, как мне практиковаться в большей осознанности, отказе от обучения поведению, которое больше не служит мне, и укреплению новых поведенческих целей.Я очень рекомендую доктора Стритера !! »
«Надежда очень хорошо умеет оценивать то, что я не говорю, а то, что я есть на самом деле, и очень хороша в том, чтобы добраться до сути вещей и помочь мне определить мыслительные процессы и модели поведения, которые присутствуют в моей жизни.