The maximum benefits of adopting OO are gained only if the software is appropriately designed. The choice of classes, and the distribution of tasks between the objects, is of crucial importance. Nontrivial systems include many recurring design problems whose solutions are commonly repeated from place to place, and from programmer to programmer. The essence and basic structure of a solution may be repeated many times, even though the realization is different in each case. Patterns offer a technique for capturing good design, and offer a quick way to become proficient at Object Oriented design. This course introduces patterns from the ground up, presenting principles as well as concrete examples in UML and Java. It develops understanding through lectures, discussion, and some exercises to reinforce the concepts by putting them into practice.