a general reusable solution to a commonly occurring problem within a given context in software design
a description of a problem and its solution that you can apply to many similar programming situations
reuses abstract knowledge about a problem and its solution, makes use of object oriented characteristics such as inheritance and polymorphism