Object orientation is great.
It promises more reusability, extensibility, and maintainability for your programs than previous paradigms. The problem is, these features don't just accidentally appear in a program, and it's even hard to purposefully program them in. Instead, you must design these features into your program. The notion of design patterns is a significant idea that has been making waves in the mainstream development community for a couple of years. A design pattern is a way of documenting a generalized design problem along with its solution and the consequences of using that solution.