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

Хотя это и называется "шаблоном проектирования", на самом деле это не имеет никакого отношения к дизайну. Шаблон выглядит стоящим в стороне от традиционных путей размышления об анализе, дизайне и реализации. Вместо этого шаблон воплощает в жизнь идею внутри программы, и, таким образом, иногда он может появиться в фазе анализа или в последней фазе проектирования. Это интересно, поскольку шаблон имеет прямую реализацию в коде и таким образом вы не можете ожидать, что он появится перед первыми фазами дизайна или реализации (а фактически, вы можете не получить то, что вам нужно для особого шаблона, пока вы не закончите эти фазы).

Основная концепция шаблона может также быть рассмотрена, как основная концепция дизайна программы: добавление уровня абстракции. Когда бы вы ни абстрагировали что-либо, вы изолируете определенные детали, и одна из наиболее полных мотиваций такого поведения состоит в отделении вещей, которые меняются от вещей, которые остаются такими же. Другими словами, как только вы находите какую-то часть программы, которую хотите изменить по той или иной причине, вы не хотите, чтобы эти изменения повлекли других изменений по всему коду вашей программы. Не только потому, что такой код сложнее в поддержке, но такой код сложнее понимать (и в результате снижается его ценность).

Часто, наиболее сложные части разработки элегантного и легкого в уходе дизайна заключаются в том, что я называю "вектором изменений". (Здесь "вектор" означает направление градиента, а не класс-контейнер). Это значит, что необходимо найти наиболее важные вещи, которые меняются в вашей системе, или, другими словами, узнать, в чем заключена самая большая ценность. Как только вы определите вектор изменений, вы найдете центральную точку, вокруг которой будете выращивать ваш дизайн.

Таким образом, цель шаблонов проектирования состоит в изоляции изменений в вашем коде. Если вы примете такую точку зрения, вы увидите некоторый шаблон проектирования в этой книге. Например, о наследовании можно думать, как о шаблоне проектирования (хотя оно осуществляется компилятором). Это позволяет вам выразить различия в поведении объектов (это вещи, которые меняются), которые имеют одинаковый интерфейс (это вещи, которые остаются одинаковыми). Композиция тоже может быть рассмотрена, как шаблон, так как она позволяет вам изменять - динамически или статически - объект, реализующий ваш класс, и, таким образом, способ работы класса.

Вы также видели и другой шаблон, который появился в Design Patterns: итератор (Java 1.0 и 1.1 капризно называл их Enumeration; контейнеры Java 2 используют "итераторы"). Это прячет обычную реализацию контейнера, в то время, как вы перебираете элементы и выбираете элементы по одному. Такой ваш код может быть использован с любым контейнером, который может породить итератор.