Design patterns are standard solutions to common software design problems. Instead of focusing on how individual components work, design patterns are a systematic approach that focus and describe abstract systems of interaction between classes, objects, and communication flow. This course explores advanced principles of object-oriented design by studying key software design patterns. The patterns are drawn from a variety of sources and illustrated through examples and case studies .Examples are presented in either Java, C++ or C sharp. Students will also have an opportunity to apply these patterns through a series of hands-on exercises.