Design Patterns-ELEMENTS OF REUSABLE OBJECT-ORIENTED SOFTWARE