Обычные способы использования цепи ответственности?
Я видел обучающее видео, объясняющее схему проектирования цепочки ответственности, и я думаю, что понимаю, как это работает, но я не уверен, когда я действительно использовал бы это. Каковы некоторые обычные способы использования цепи ответственности?
1 ответ
От GoF:
Известное использование
Некоторые библиотеки классов используют шаблон цепочки ответственности для обработки пользовательских событий. Они используют разные имена для класса Handler, но идея та же: когда пользователь щелкает мышью или нажимает клавишу, событие генерируется и передается по цепочке. MacApp [App89] и ET++ [WGM88] называют его "EventHandler", библиотека TCL Symantec [Sym93b] называет его "Бюрократ", а AppKit NeXT [Add94] использует имя "Ответчик".
Инфраструктура Unidraw для графических редакторов определяет объекты Command, которые инкапсулируют запросы к объектам Component и ComponentView [VL90]. Команды - это запросы в том смысле, что компонент или представление компонента могут интерпретировать команду для выполнения операции. Это соответствует подходу "запросы как объекты", описанному в разделе "Реализация". Компоненты и представления компонентов могут быть структурированы иерархически. Компонент или представление компонента может переслать интерпретацию команды своему родителю, который, в свою очередь, может переслать его своему родителю и т. Д., Тем самым образуя цепочку ответственности.
ET ++ использует Chain of Responsibility для обработки графического обновления. Графический объект вызывает операцию InvalidateRect всякий раз, когда он должен обновить часть своего внешнего вида. Графический объект не может обрабатывать InvalidateRect сам по себе, потому что он недостаточно знает о своем контексте. Например, графический объект может быть заключен в такие объекты, как Scrollers или Zoomers, которые преобразуют его систему координат. Это означает, что объект можно прокручивать или увеличивать, чтобы он частично был вне поля зрения. Поэтому реализация по умолчанию InvalidateRect направляет запрос к объекту контейнера. Последний объект в цепочке пересылки - это экземпляр Window. К тому времени, когда Window получает запрос, прямоугольник аннулирования гарантированно будет правильно преобразован. Окно обрабатывает InvalidateRect, уведомляя интерфейс оконной системы и запрашивая обновление.