In programming, things work by names. Therefore, if you have to change something, add something, remove something, it normally takes a lot of work, as your have to re-implement the names.
Design Patterns is a successful attempt to eliminate the frustration by helping you create a separate interface (where you tell the program what things do) from your classes (how you implement actions).
While it is commonly used in programming, it is also used in architecture.
I used to think real programmers subclassed everything until I found out about design patterns.