a description of a problem and its solution that you can apply to many similar programming situations
a standard solution to a common programming problem; a technique for making code more flexible; shorthand for describing program design and how program components are connected
serve as a tool to communicate ideas, solutions, and knowledge about commonly recurring design problems.