>An 'element of reusable software'
>A design pattern systematically names, motivates, and explains a general design that addresses a recurring design problem in object-oriented systems. It describes the problem, the solution, when to apply the solution, and its consequences. It also gives implementation hints and examples. The solution is a general arrangement of objects and classes that solve the problem. The solution is customized and implemented to solve the problem in a particular context.
Interesting to note that the person defines a pattern as something exclusive to using Objects and classes or in other words OOP. So something like lenses or functors or programming techniques defined outside of OOP are not patterns.
When I talk to people they often define design patterns as a common language for various methods that are common to programming and not exclusive to OOP. Doesn't english and vocabulary fill this space? You don't find carpentry workers referring to domain specific vocabulary as design patterns. Why don't FP practitioners or mathematicians call their techniques "patterns"?
This may piss some people off and get me a load of downvotes, but honestly IMO I find design patterns to be just snobbery. Instead of saying someone is iterating through a list they say that someone is using the iterator pattern. It's really just prefixing the word "pattern" onto some vocabulary. I used the number pattern on the variable pattern and the addition pattern to get the sum of two numbers.
I would've just called the book "Programming Tricks for OOP" rather then "Design Patterns."