Все мы пользовались готовыми библиотеками и инфраструктурами. Мы берём их, пишем код с использованием функций API, компилируем и извлекаем пользу из кода, написанного другими людьми. Достаточно вспомнить, какую функциональность предоставляет Java API: сеть, графические интерфейсы, ввод/вывод и т.д. Однако библиотеки и инфраструктуры не помогают нам структурировать приложение так, чтобы они становились более понятными, гибкими и простыми в сопровождении. Для достижения этой цели применяются паттерны проектирования.

Паттерны относятся к более высокому уровню, чем библиотеки. Они определяют способы структурирования классов и объектов для решения некоторых задач, а наша задача - адаптировать их для своих конкретных приложений. А сами библиотеки и инфраструктуры не являются паттернами проектирования, так как представляют собой конкретные реализации, которые мы связываем со своим кодом. Впрочем, иногда паттерны используются в реализациях библиотек. И это хорошо, потому что понимание паттернов поможет быстрее разобраться в API, архитектура которых базируется на паттернах.

Принципы построения объектно-ориентированных систем далеко не всегда очевидны. На основе этих не очевидных принципов были сформулированы паттерны проектирования.

Некоторые шаблоны возможно слишком переоценены, а некоторые наоборот недооценены, некоторые особенно подходят для применения в играх, а некоторые иногда просто путают с другими областями программирования.

Возьмём шаблон Command. Для такого шаблона "банда четырёх" приготовила ожидаемо заумное описание: 

Инкапсуляция запроса  внутри объекта, позволяющая пользователю параметризировать клиенты с помощью различных запросов, организовывать в очереди или регистрировать запросы или организовывать поддержку  отменяемых операций.

Пояснение следующее: Мы возьмем некую концепцию и превратим ее в набор данных — объект, который можно поместить в переменную, передать в функцию и т.д.
Таким образом если мы говорим, что команда — это "материализация вызова метода"
— это означает что вызов метода оборачивается некоторым объектом.

Есть много разных названий: "обратный вызов", "функция первого класса", "указатель
на функцию", "замыкание (closure)", "частично примененная функция (partially
applied function)", в зависимости от языка, к которому вы привыкли. Однако все это
одного поля ягоды. Банда четырех немного дальше уточняет:
Команда — это объектно- ориентированная замена обратного вызова.