Designing with Objects: Object-Oriented Design Patterns Explained with Stories from Harry Potter