Move work from a requester class into a more suitable, cohesive delegate. The requester asks the delegate to perform the work without depending on its implementation. section 2.3.2
Delegation improves the design by:
- Keeping attribute matching inside Attributes, where that responsibility fits better. section 2.3.2
- Reducing Catalogue's knowledge of book attributes and limiting change leaks. section 2.3.2
- Supporting loose coupling among Catalogue, Book, and Attributes. section 2.3.2
Catalogue delegates matching
Catalogue::find() obtains each Book object's Attributes object and calls is_match(target_attrs). Catalogue coordinates the search while Attributes decides whether attributes match.

