Object Oriented Programming And Design Patterns