Разбор слов по составу
Разбор слова по составу
Тип лингвистического анализа, в результате которого определяется структура слова, а также его состав, называется морфемным анализом.
Виды морфем
В русском языке используются следующие морфемы:
— Корень. В нем заключается значение самого слова. Слова, у которых есть общий корень, считаются однокоренными. Иногда слово может иметь два и даже три корня.
— Суффикс. Обычно идет после корня и служит инструментом для образования других слов. К примеру, «гриб» и «грибник». В слове может быть несколько суффиксов, а может не быть совсем.
— Приставка. Находится перед корнем. Может отсутствовать.
— Окончание. Та часть слова, которая изменяется при склонении или спряжении.
— Основа. Часть слова, к которой относятся все морфемы, кроме окончания.
Важность морфемного разбора
В русском языке разбор слова по составу очень важен, ведь нередко для правильного написания слова необходимо точно знать, частью какой морфемы является проверяемая буква.
Пример
В качестве примера можно взять два слова: «чёрный» и «червячок». Почему в первом случае на месте ударной гласной мы пишем «ё», а не «о», как в слове «червячок»? Нужно вспомнить правило написания букв «ё», «е», «о» после шипящих, стоящих в корне слова. Если возможно поменять форму слова либо подобрать родственное ему так, чтобы «ё» чередовалась с «е», тогда следует ставить букву «ё» (чёрный — чернеть). Если чередование отсутствует, тогда ставится буква «о» (например, чокаться, шорты).
В случае же со словом «червячок» «-ок-» — это суффикс. Правило заключается в том, что в суффиксах, если стоящая после шипящих букв гласная находится под ударением, всегда пишется «о» (зрачок, снежок), в безударном случае — «е» (платочек, кармашек).
Как разобрать слово по составу
Для помощи начинающим существуют морфемно-орфографические словари. Можно выделить книги таких авторов, как Тихонов А.Н.
, Ожегов С.И., Рацибурская Л.В.В любом слове непременно должны присутствовать корень и основа. Остальных морфем может и не быть. Иногда слово целиком может состоять из корня (или основы): «гриб», «чай» и т.д.
Этапы морфемного анализа
Чтобы морфемный разбор слов было легче осуществить, следует придерживаться определенного алгоритма:
— Сначала нужно определить часть речи, задав вопрос к слову. Для прилагательного это будет вопрос «какой?», для существительного — «что?» или «кто?».
— Затем нужно выделить окончание. Чтобы его найти, слово нужно просклонять по падежам, если часть речи это позволяет. Например, наречие изменить никак нельзя, поэтому у него не будет окончания.
— Далее нужно выделить основу у слова. Все, кроме окончания, — основа.
— Потом следует определить корень, подобрав родственные однокоренные слова.
Особенности разбора
Иногда подход к морфемному разбору в программах университета и школы может отличаться. Во всех случаях различия аргументированы и имеют право на существование. Поэтому стоит ориентироваться на морфемный словарь, рекомендованный в конкретном учебном заведении.
Только что искали: неза сейчас л и а п е н к сейчас в о д о р о г сейчас т р у ба сейчас кормноэ сейчас василек 1 секунда назад доттмасон 1 секунда назад индивидуализировавшему 1 секунда назад г о е д о л л 1 секунда назад агние 2 секунды назад кромьво 3 секунды назад гонкаор 3 секунды назад кортузаг 3 секунды назад ассортиц 3 секунды назад природа 3 секунды назад
Сочинительные и подчинительные союзы — Таблица с примерами
Научим писать без ошибок и интересно рассказывать
Начать учиться
489.2K
И, а, но, как, пока, лишь — это все союзы, которые делают нашу речь более связной. По значению союзы делятся на две группы: сочинительные и подчинительные. Расскажем, в чем их отличия.
Понятие о союзе
Между словами и предложениями есть два вида синтаксической связи — сочинительная и подчинительная.
Сочинительная связь объединяет равноправные части. Сочинением связаны части сочинительных словосочетаний (мама и папа) и сложносочиненных предложений:
- Гром затих, но дождь все лил и лил.
Основным средством связи при сочинении являются сочинительные союзы: и, а, но, да и др.
Подчинительная связь объединяет главную (подчиняющую) и зависимую (подчиненную) части. Обычно при подчинении можно задать вопрос от главной части к зависимой:
- знать (что?) литературу;
- я не знаю (чего?), что будет завтра.
Подчинением связаны части подчинительных словосочетаний и сложноподчиненных предложений.
Союз — это служебная часть речи, которая соединяет однородные члены в простых предложениях, а в сложных — объединяет два и более простых.
По строению союзы делят на простые и составные:
- Простые союзы состоят из одного слова: и, а, но, да, что, если, когда.
- Составные союзы состоят из двух и более слов: потому что, так как, как будто, оттого что, вследствие того что, не только — но и, в силу того что, с тех пор как, до тех пор пока.
Есть еще одна категория — союзные слова. Это относительные местоимения, которые используют для связи простых предложений в составе сложноподчиненного
Подчинительные союзы | Союзные слова | |
Простые | Составные | |
что, чтобы, как, когда, ибо, пока, будто, словно, если | потому что, оттого что, так как, так что, лишь только, как будто, с тех пор как, в связи с тем что, для того чтобы | что, кто, как, когда, который, какой, куда, откуда |
Иногда простые подчинительные союзы совпадают по написанию с союзными словами.
Чтобы отличить союз от союзного слова, нужно помнить:
Подчинительные союзы не могут быть членами придаточного предложения. Они служат только для присоединения придаточных к главному или другому придаточному.
Союзные слова являются членами придаточных предложений и «присоединяют» придаточные предложения к главному (или к другому придаточному).
В некоторых случаях союз можно опустить. Союзное слово опустить нельзя.
Союз можно заменить только другим союзом.
Союзное слово можно заменить только союзным словом или теми словами из главного предложения, к которым относится придаточное.
Рассмотрим, какие союзы называют сочинительными, а какие подчинительными.
Пятерка по русскому у тебя в кармане!
Все правила по русскому языку под рукой
Сочинительные союзы
Сочинительные союзы — союзы, которые связывают однородные члены в простом предложении и простые предложения в составе сложносочиненных предложений.
Запоминаем!
Терминов «сложносочинённые союзы» и «сложно сочинительные союзы» в русском языке нет.
Группы сочинительных союзов:
- Соединительные — выражают перечисление предметов, их признаков и качеств, одновременность или последовательность действия.
- Разделительные — значение разделения, играют роль выбора, чередования, исключения.
- Пояснительные — выражают пояснение к сказанному.
Чтобы быстрее запомнить, какие союзы называются сочинительными, собрали для вас таблицу с примерами.
Группы | Союзы | Примеры |
Соединительные | и, да (в значении и), ни ни, тоже, также, не только, но и, не столько, сколько, не то чтобы, но, не то чтобы, а | Ни грибов, ни ягод не было в этом лесу. Не только дети, но и взрослые с удовольствием смотрят мультики. Она уже зашла в театр, я тоже почти был на месте. Брат не столько расстроился, сколько удивился отказу отца. |
Разделительные | или, либо, то – то, не то – не то, или – или | Возьми из холодильника огурец или помидор. Не могу решить: или мне еще поучиться, или пора пойти отдыхать. |
Противительные | а, но, зато, однако (в значении но) | Маша очень любила киви, но они вызывали у него аллергию. На улице темнело, однако девочки уже вернулись. |
Пояснительные | то есть, а именно | Шеф решил уехать в Испанию, а именно в Барселону. |
Правило сочинительных союзов | |
---|---|
Запятая нужна | Запятая не нужна |
Если однородные члены предложения связаны повторяющимися соединительными или разделительными союзами В этих словах было и восхищение, и благодарность, и любовь | Если однородные члены предложения связаны одиночным соединительным или разделительным союзом Иней быстро покрыл окна домов и магазинные витрины. |
Отработать новый материал на практике помогут онлайн-курсы по русскому языку в школе Skysmart.
Подчинительные союзы
Подчинительные союзы — союзы, которые связывают простые предложения в составе сложноподчиненного предложения.
Запоминаем!
Термина «сложноподчиненные союзы» в русском языке нет.
Группы подчинительных союзов:
- Изъяснительные — указывают на то, о чем говорят.
- Временные — указывают на время.
- Причинные — указывают на причину.
- Целевые — указывают на цель.
- Условные — указывают на условие.
- Уступительные — указывают на противоречие одного события другому.
- Сравнительные — указывают на сравнение.
- Следственные — указывают на следствие.
Чтобы различать подчинительные союзы и узнать, как их использовать, составили таблицу с примерами:
Группа | Союзы | Примеры |
Изъяснительные | что, чтоб, когда, как, чтобы | Мы верили, что однажды он это сделает. Она встала до рассвета, чтобы все успеть. |
Временные | когда, пока, с тех пор, едва, прежде чем, перед тем как, лишь | Когда мы пришли, обед уже был готов. Он достаточно отдохнул, пока спал. |
Причинные | вследствие, потому что, из-за того, что, ввиду того, что, благодаря тому что | Дети остались дома из-за того, что начались морозы. Дерево упало, потому что был сильный ветер. |
Сравнительные | такие как, как будто, как, точно, будто, подобно тому | Собака так радовалась, будто не видела нас неделю. Снег падал, точно пух высыпали из подушки. |
Целевые | для того чтобы, из-за того что, чтобы, дабы | Они завели кота, чтобы тот ловил мышей. Для того чтобы быть здоровым, нужно правильно питаться. |
Условные | если, когда, коли, ежели, раз | Действуй, если принял решение. Все будет, когда придет время. Раз ты так хочешь, значит так будет. |
Уступительные | несмотря ни на что, пускай, хотя, вопреки тому что | Я счастлив, пускай не навсегда. Он отправился в путь, хотя сотник запретил выезжать из города. |
Следственные | поэтому, из-за этого, так что | Было сумрачно, поэтому включили фонари. Пошел дождь, из-за этого все планы отменились. |
Коварные союзы — будьте с ними внимательны
Будто — какой союз: сочинительный или подчинительный?
Сочинительный, из группы изъяснительных.
Словно — сочинительный или подчинительный союз?
Сочинительный, из группы сравнительных.
Пока — какой союз подчинительный или сочинительный?
Подчинительный, из группы временных.
Точно — союз сочинительный или подчинительный?
Сочинительный, из группы сравнительных.
Даже — какой союз сочинительный или подчинительный?
Сочинительный, из группы присоединительных.
Шпаргалки для родителей по русскому
Все формулы по русскому языку под рукой и бесплатно
Лидия Казанцева
Автор Skysmart
К предыдущей статье
196.5K
Род имен существительных
К следующей статье
319.1K
Причастный оборот
Получите план развития речи и письма на бесплатном вводном уроке
На вводном уроке с методистом
Выявим пробелы в знаниях и дадим советы по обучению
Расскажем, как проходят занятия
Подберём курс
Корень слова: temp (корень) | Membean
Латинское корневое слово temp означает «время». Быстрый двухминутный temp o для этого подкаста позволит вам выучить этот латинский корень в кратчайшие сроки!
temp устная продолжительность жизни ограничена «временем», условием, которым управляется вся жизнь на планете Земля. Люди, живущие в одно и то же «время» с другими, находятся в согласии друг с другом, живут в одно и то же время или в одно и то же «время». К сожалению, смертная жизнь всего лишь temp обычное событие, определяемое относительно коротким «временем». Любой temp или temp обычный работник предприятия, чья работа длится лишь ограниченный период «времени», скажет вам, как быстро это «время» идет! Чем старше люди, тем больше они понимают старую латинскую поговорку temp us fugit: «время летит».
Для всех нас, кто играл на инструменте, мы знаем, что каждое музыкальное произведение имеет определенное temp o или «время», то есть как быстро или медленно оно должно исполняться. Представьте, что вы идете на сольный концерт, не отрепетировав пьесу, которую должны были сыграть… вам придется сыграть пример 9.0003 temp быстро, так как у вас не будет «времени» для практики. Если бы вы действительно не были уверены в пьесе, которую должны были сыграть, вы могли бы попробовать temp orizing, чтобы выиграть больше «времени» для подготовки. Вы также можете надеяться на своего рода contre temp s, чтобы спасти положение, или на несвоевременное событие, которое прерывает гладкое течение «времени». Только сбывшееся несколько рискованное желание могло положить конец бывшему temp сочинению или исполнению произведения, на подготовку которого у вас изначально не хватило «времени»!
А темп есть? temp est или буря случаются только в определенное «время» дня или года; посмотрите на эту полуденную грозу, которая, кажется, всегда приходит в одно и то же «время» дня летом!
Теперь, когда отведенное нам «время» истекло, я больше не буду отнимать у вас «время», чтобы вы могли «успеть» к любому temp orary событию, которое будет для вас следующим!
- временное : «времени»
- современный : «время», проведенное вместе
- одновременный : «время», проведенное вместе
- временное : короткое «времени»
- temp : работник, нанятый на короткий период «времени»
- tempus fugit : «время летит» на латыни
- темп : «тайминг» или скорость чего-то
- импровизированный : из-за отсутствия «времени» для подготовки
- выжидать : откладывать, чтобы получить больше «времени» для выполнения чего-либо
- contretemps : событие, которое идет вразрез с гладким «временем» периода «времени»
- экспромт : играть без «времени» на подготовку музыкального произведения
- буря : буря, которая приходит в определенное «время»
Цепочка ответственности
/ Шаблоны проектирования / Поведенческие модели
Также известен как: CoR, Chain of Command
НамерениеЦепочка ответственности — это поведенческий шаблон проектирования, позволяющий передавать запросы по цепочке обработчиков. Получив запрос, каждый обработчик решает либо обработать запрос, либо передать его следующему обработчику в цепочке.
ПроблемаПредставьте, что вы работаете над системой онлайн-заказов. Вы хотите ограничить доступ к системе, чтобы только авторизованные пользователи могли создавать заказы. Кроме того, пользователи с правами администратора должны иметь полный доступ ко всем заказам.
После небольшого планирования вы поняли, что эти проверки должны выполняться последовательно. Приложение может попытаться аутентифицировать пользователя в системе всякий раз, когда оно получает запрос, содержащий учетные данные пользователя. Однако, если эти учетные данные неверны и аутентификация не удалась, нет причин продолжать какие-либо другие проверки.
Запрос должен пройти ряд проверок, прежде чем система заказов сможет его обработать.
В течение следующих нескольких месяцев вы реализовали еще несколько таких последовательных проверок.
Один из ваших коллег предположил, что передавать необработанные данные прямо в систему заказов небезопасно. Итак, вы добавили дополнительный шаг проверки для очистки данных в запросе.
Позже кто-то заметил, что система уязвима для взлома паролей методом грубой силы. Чтобы предотвратить это, вы быстро добавили проверку, которая отфильтровывает повторяющиеся неудачные запросы, поступающие с одного и того же IP-адреса.
Кто-то еще предложил ускорить работу системы, возвращая кэшированные результаты при повторных запросах, содержащих одни и те же данные. Следовательно, вы добавили еще одну проверку, которая пропускает запрос в систему, только если нет подходящего кэшированного ответа.
Чем больше код рос, тем запутаннее он становился.
Код чеков, и без того выглядевший кашей, становился все более и более раздутым по мере добавления каждой новой функции. Изменение одного чека иногда влияло на другие. Хуже всего то, что когда вы пытались повторно использовать проверки для защиты других компонентов системы, вам приходилось дублировать часть кода, поскольку эти компоненты требовали некоторых проверок, но не всех.
Система стала очень сложной для понимания и дорогой в обслуживании. Вы какое-то время боролись с кодом, пока однажды не решили провести рефакторинг всего этого.
РешениеКак и многие другие поведенческие шаблоны проектирования, цепочка ответственности полагается на преобразование определенных поведений в автономные объекты, называемые обработчиками . В нашем случае каждая проверка должна быть извлечена в свой класс с помощью одного метода, выполняющего проверку. Запрос вместе со своими данными передается этому методу в качестве аргумента.
Шаблон предлагает связать эти обработчики в цепочку. Каждый связанный обработчик имеет поле для хранения ссылки на следующий обработчик в цепочке. Помимо обработки запроса, обработчики передают запрос дальше по цепочке. Запрос перемещается по цепочке до тех пор, пока все обработчики не получат возможность его обработать.
Вот лучшая часть: обработчик может принять решение не передавать запрос дальше по цепочке и эффективно остановить дальнейшую обработку.
В нашем примере с системами заказов обработчик выполняет обработку, а затем решает, передать ли запрос дальше по цепочке. Предполагая, что запрос содержит правильные данные, все обработчики могут выполнять свое основное поведение, будь то проверка подлинности или кэширование.
Обработчики выстраиваются один за другим, образуя цепочку.
Однако есть немного другой подход (и он немного более каноничный), при котором, получив запрос, обработчик решает, может ли он его обработать. Если это возможно, он не передает запрос дальше. Таким образом, либо только один обработчик обрабатывает запрос, либо вообще ничего. Этот подход очень распространен при работе с событиями в стеках элементов в графическом пользовательском интерфейсе.
Например, когда пользователь нажимает кнопку, событие распространяется по цепочке элементов графического интерфейса, которая начинается с кнопки, проходит по ее контейнерам (таким как формы или панели) и заканчивается главным окном приложения. Событие обрабатывается первым элементом в цепочке, способным его обработать. Этот пример также примечателен тем, что он показывает, что цепочку всегда можно извлечь из дерева объектов.
Цепочка может быть сформирована из ветви дерева объектов.
Крайне важно, чтобы все классы обработчиков реализовывали один и тот же интерфейс. Каждый конкретный обработчик должен заботиться только о следующем, имеющем метод execute
. Таким образом, вы можете создавать цепочки во время выполнения, используя различные обработчики, не связывая свой код с их конкретными классами.
Звонок в службу технической поддержки может проходить через нескольких операторов.
Вы только что купили и установили на свой компьютер новое оборудование. Поскольку вы гик, на компьютере установлено несколько операционных систем. Вы пытаетесь загрузить их все, чтобы увидеть, поддерживается ли оборудование. Windows автоматически обнаруживает и включает оборудование. Однако ваш любимый линукс отказывается работать с новым железом. С небольшим проблеском надежды вы решаете позвонить по телефону техподдержки, указанному на коробке.
Первое, что вы слышите, это механический голос автоответчика. Он предлагает девять популярных решений различных проблем, ни одно из которых не имеет отношения к вашему делу. Через некоторое время робот подключает вас к живому оператору.
Увы, ничего конкретного оператор подсказать тоже не может. Он продолжает цитировать длинные выдержки из руководства, отказываясь слушать ваши комментарии. Услышав фразу «вы пробовали выключить и снова включить компьютер?» в 10-й раз вы требуете, чтобы вас соединили с настоящим инженером.
В конце концов, оператор передает ваш звонок одному из инженеров, который, вероятно, часами жаждал живого человеческого общения, сидя в своей одинокой серверной в темном подвале какого-то офисного здания. Инженер расскажет вам, где скачать подходящие драйверы для вашего нового оборудования и как установить их в Linux. Наконец-то решение! Вы заканчиваете разговор, разрываясь от радости.
СтруктураОбработчик объявляет интерфейс, общий для всех конкретных обработчиков. Обычно он содержит только один метод для обработки запросов, но иногда может иметь и другой метод для установки следующего обработчика в цепочке.
Базовый обработчик — это необязательный класс, в который можно поместить шаблонный код, общий для всех классов обработчиков.
Обычно этот класс определяет поле для хранения ссылки на следующий обработчик. Клиенты могут построить цепочку, передав обработчик конструктору или сеттеру предыдущего обработчика. Класс также может реализовать поведение обработки по умолчанию: он может передать выполнение следующему обработчику после проверки его существования.
Concrete Handlers содержат фактический код для обработки запросов. При получении запроса каждый обработчик должен решить, обрабатывать ли его и, дополнительно, передавать ли по цепочке.
Обработчики обычно автономны и неизменяемы, принимая все необходимые данные только один раз через конструктор.
Клиент может составлять цепочки только один раз или составлять их динамически, в зависимости от логики приложения. Обратите внимание, что запрос может быть отправлен любому обработчику в цепочке — он не обязательно должен быть первым.
В этом примере шаблон Цепочка ответственности отвечает за отображение контекстной справочной информации для активных элементов графического интерфейса.
Классы GUI построены по шаблону Composite. Каждый элемент связан со своим элементом-контейнером. В любой момент вы можете построить цепочку элементов, которая начинается с самого элемента и проходит через все его элементы-контейнеры.
Графический интерфейс приложения обычно имеет структуру дерева объектов. Например, Dialog
Класс, отображающий главное окно приложения, будет корнем дерева объектов. Диалог содержит панелей
, которые могут содержать другие панели или простые низкоуровневые элементы, такие как кнопки
и текстовые поля
.
Простой компонент может отображать краткие контекстные всплывающие подсказки, если компоненту назначен текст справки. Но более сложные компоненты определяют свой собственный способ отображения контекстной справки, например, показ выдержки из руководства или открытие страницы в браузере.
Вот как запрос на помощь проходит через объекты GUI.
Когда пользователь наводит курсор мыши на элемент и нажимает клавишу F1
, приложение обнаруживает компонент под указателем и отправляет ему запрос на помощь. Запрос проходит через все контейнеры элемента, пока не достигнет элемента, способного отображать справочную информацию.
// Интерфейс обработчика объявляет метод для выполнения
// запрос.
Интерфейс ComponentWithContextualHelp
метод showHelp()
// Базовый класс для простых компонентов.
абстрактный класс Компонент реализует ComponentWithContextualHelp
поле tooltipText: строка
// Контейнер компонента действует как следующая ссылка в
// цепочка обработчиков.
Контейнер защищенного поля: Контейнер
// Компонент показывает всплывающую подсказку, если есть текст справки
// присвоено ему. В противном случае вызов перенаправляется на
// контейнер, если он существует.
метод showHelp() есть
если (текст подсказки != ноль)
// Показать всплывающую подсказку.
еще
контейнер.showHelp()
// Контейнеры могут содержать как простые компоненты, так и другие
// контейнеры как дочерние элементы. Цепные отношения
// установлено здесь. Класс наследует поведение showHelp от
// его родитель.
абстрактный класс Контейнер расширяет компонент
дочерние элементы защищенного поля: массив компонентов
метод add(child) есть
дети.добавить(ребенок)
ребенок.контейнер = это
// Примитивные компоненты могут работать со справкой по умолчанию
// выполнение...
Класс Кнопка расширяет Компонент
// ...
// Но сложные компоненты могут переопределить значение по умолчанию
// выполнение. Если текст справки не может быть предоставлен в новом
// таким образом, компонент всегда может вызвать базовую реализацию
// (см. Класс компонента).
класс Panel расширяет контейнер
поле modalHelpText: строка
метод showHelp() есть
если (modalHelpText != ноль)
// Показать модальное окно с текстом справки.
еще
супер.showHelp()
// ...то же, что и выше...
диалоговое окно класса расширяет контейнер
поле wikiPageURL: строка
метод showHelp() есть
если (wikiPageURL != ноль)
// Открытие страницы справки вики.
еще
супер.showHelp()
// Клиентский код.
приложение класса
// Каждое приложение настраивает цепочку по-своему.
метод createUI() есть
диалог = новый диалог ("Бюджетные отчеты")
dialog.wikiPageURL = "http://..."
панель = новая панель (0, 0, 400, 800)
panel.modalHelpText = "Эта панель делает..."
ок = новая кнопка (250, 760, 50, 20, "ОК")
ok.tooltipText = "Это кнопка OK, которая..."
отмена = новая кнопка (320, 760, 50, 20, "Отмена")
// ...
панель.добавить(ок)
панель.добавить(отмена)
диалог.добавить(панель)
// Представьте, что здесь происходит.
метод onF1KeyPress() есть
компонент = this.getComponentAtMouseCoords()
компонент.showHelp()
ПрименимостьИспользуйте шаблон цепочки ответственности, когда предполагается, что ваша программа будет обрабатывать различные типы запросов различными способами, но точные типы запросов и их последовательность заранее неизвестны.
Паттерн позволяет связать несколько обработчиков в одну цепочку и при получении запроса «спросить» у каждого обработчика, может ли он его обработать. Таким образом, все обработчики получают возможность обработать запрос.
Используйте шаблон, когда необходимо выполнить несколько обработчиков в определенном порядке.
Поскольку вы можете связывать обработчики в цепочке в любом порядке, все запросы будут проходить через цепочку именно так, как вы планировали.
Используйте шаблон CoR, когда набор обработчиков и их порядок должны измениться во время выполнения.
Если вы предоставляете сеттеры для ссылочного поля внутри классов обработчиков, вы сможете динамически вставлять, удалять или изменять порядок обработчиков.
Как реализоватьОбъявить интерфейс обработчика и описать сигнатуру метода для обработки запросов.
Решите, как клиент будет передавать данные запроса в метод. Самый гибкий способ — преобразовать запрос в объект и передать его методу обработки в качестве аргумента.
Чтобы устранить повторяющийся шаблонный код в конкретных обработчиках, возможно, стоит создать абстрактный базовый класс обработчика, производный от интерфейса обработчика.
Этот класс должен иметь поле для хранения ссылки на следующий обработчик в цепочке. Подумайте о том, чтобы сделать класс неизменяемым. Однако, если вы планируете изменять цепочки во время выполнения, вам необходимо определить установщик для изменения значения поля ссылки.
Вы также можете реализовать удобное поведение по умолчанию для метода обработки, которое заключается в перенаправлении запроса к следующему объекту, если такового не осталось. Конкретные обработчики смогут использовать это поведение, вызвав родительский метод.
Один за другим создайте конкретные подклассы обработчиков и реализуйте их методы обработки. Каждый обработчик должен принять два решения при получении запроса:
- Будет ли обрабатываться запрос.
- Будет ли передаваться запрос по цепочке.
Клиент может либо собирать цепочки самостоятельно, либо получать готовые цепочки от других объектов. В последнем случае необходимо реализовать некоторые фабричные классы для построения цепочек в соответствии с настройками конфигурации или среды.
Клиент может вызвать любой обработчик в цепочке, а не только первый. Запрос будет передаваться по цепочке до тех пор, пока какой-либо обработчик не откажется передавать его дальше или пока он не достигнет конца цепочки.
Из-за динамического характера цепочки клиент должен быть готов к следующим сценариям:
- Цепь может состоять из одного звена.
- Некоторые запросы могут не достигать конца цепочки.
- Другие могут достичь конца цепочки без обработки.
- Вы можете управлять порядком обработки запросов.
- Принцип единой ответственности . Вы можете отделить классы, которые вызывают операции от классов, которые выполняют операции.
- Открытый/Закрытый Принцип . Вы можете добавлять в приложение новые обработчики, не нарушая существующий клиентский код.
- Некоторые запросы могут остаться необработанными.
Chain of Responsibility, Command, Mediator и Observer обращаются к различным способам соединения отправителей и получателей запросов:
- Цепочка ответственности передает запрос последовательно по динамической цепочке потенциальных получателей, пока один из них не обработает его.
- Команда устанавливает однонаправленные соединения между отправителями и получателями.
- Посредник устраняет прямые соединения между отправителями и получателями, заставляя их взаимодействовать косвенно через объект-посредник.
- Observer позволяет получателям динамически подписываться и отменять подписку на получение запросов.
Chain of Responsibility часто используется в сочетании с Composite. В этом случае, когда листовой компонент получает запрос, он может передать его по цепочке всех родительских компонентов до корня дерева объектов.
Обработчики в цепочке ответственности могут быть реализованы как команды. В этом случае вы можете выполнять множество различных операций над одним и тем же объектом контекста, представленным запросом.
Однако есть и другой подход, когда сам запрос представляет собой Команда объект. В этом случае вы можете выполнять одну и ту же операцию в ряде различных контекстов, связанных в цепочку.
Chain of Responsibility и Decorator имеют очень похожую структуру классов. Оба шаблона полагаются на рекурсивную композицию, чтобы передать выполнение через ряд объектов. Однако есть несколько принципиальных отличий.