В предыдущем видео мы познакомились с таким понятием, как шаблон проектирования. Вы узнали, что шаблоны используются для решения огромного количества различных задач. В таком разнообразии объектов очень легко запутаться. Чтобы путаницы не возникало, давайте разобьем наши объекты на некоторые группы. Одним из параметров, по которым мы можем классифицировать наши объекты, может служить сложность задачи, для которой применяется паттерн. Самые низкоуровневые паттерны существуют на уровне языка программирования. Они описывают методы решения довольно простых задач средствами конкретного языка. Такие низкоуровневые паттерны принято называть идиомами. Идиомы в языке Python можно называть, например, реализацию тернарного оператора или генерацию списков на лету, известную, как List Comprehension. Про некоторые из идиом вам уже было рассказано в предыдущих курсах. В этом курсе мы на них останавливаться, увы, не будем. Следующие по уровню шаблоны применяются для решения более крупных задач, они более абстрактные и меньше привязаны к языку программирования. Про некоторые из них и пойдет речь в этом курсе. Они по структуре намного более сложные и записать их в одну строчку, как это было с идиомами, увы, уже не получится. Наиболее абстрактными и высокоуровневыми являются архитектурные паттерны. Они уже абсолютно не привязаны к языку программирования и решению каких-то частных задач, а описывают архитектуру программной системы полностью. Примерами таких архитектурных паттернов, может быть, например, клиент-серверная архитектура или часто используемая в графических приложениях архитектура Model-View-Controller, MVC. Эта архитектура позволяет разделить бизнес-логику приложения от его графического представления. Однако, даже, если исключить из рассмотрения идиомы и архитектурные шаблоны, остается очень много других паттернов проектирования и хотелось бы их также разбить на какие-то более мелкие группы. Давайте разделим их по типам задач, для которых они применяются. Выделим четыре группы на проектирование: это структурные, порождающие, поведенческие и конкурентные. Давайте разберемся, для чего используются паттерны в каждой из этих групп. Структурные шаблоны, как следует из их названия, модифицируют структуру объектов. Они могут служить для получения из классов более сложных структур или, например, для реализации альтернативного доступа к объектам. К структурным шаблонам, например, относятся такие шаблоны, как адаптер, мост, компоновщик, декоратор, фасад, приспособленец, заместитель. Порождающие паттерны, как следует из их названия, используются при создании различных объектов. Они призваны разделить процесс создания объекта и использование их системой. Это может быть применено, например, для реализации способа создания некоторых объектов, независимо от типов создаваемых объектов. Или, например, для сокрытия процесса создания объекта от системы, которая его используют. К порождающим шаблонам относятся такие паттерны, как абстрактная фабрика, строитель, фабричный метод, отложенная инициализация, пул одиночек, прототип. Или самый сомнительный из паттернов проектирования это одиночка — Singleton. Поведенческие паттерны описывают способы реализации взаимодействия между объектами различных типов. При взаимодействии объекты часто могут решать гораздо более сложные задачи, чем могли бы решить по отдельности. К поведенческим шаблонам относятся такие шаблоны, как цепочка обязанностей, интерпретатор, итератор, хранитель, наблюдатель, состояние, стратегия, посетитель и многие-многие другие. Данная группа является самой обширной из всех групп паттернов проектирования. Четвертая группа конкурентные паттерны. Это такие особые шаблоны, которые применяются в параллельном программировании. Они используются для реализации взаимодействия различных процессов и потоков. Хотя в нашем курсе о них отдельно рассказываться не будет, знание о их существовании все-таки может помочь вам в дальнейшей работе как программиста на Python. К конкурентным паттернам относятся такие шаблоны, как: блокировка, монитор, планировщик, активный объект. Данные шаблоны, как еще раз отмечу, применяются в весьма узкой области. Именно такая классификация обычно используется при описании шаблонов проектирования. Она была предложена создателями шаблонов проектирования и авторами книги "Design patterns elements of reusable object-oriented software", о которой я говорил в предыдущем видео. В следующих видео мы с вами более подробно рассмотрим такие паттерны, как: адаптер, декоратор, наблюдатель, абстрактная фабрика и цепочка обязанностей.