Предположим, что вы хорошо проявили себя с предыдущим заданием. И теперь заказчики пришли к вам с новым заданием. В этом задании, менестрель (поэт-музыкант из средневековья, сопровождавший рыцарей и воспевавших их действия) должен сопровождать каждого рыцаря, воспевая все его поступки и действия в песнях. Хм... менестрель, который поет о рыцаре? Ничего сложного. Создадим класс Minstrel:
Для поддержания стиля мышления dependency injection, мы изменяем класс KnightOfTheRoundTable для получения объекта Minstrel:
Все должно работать. Хотя стоп... есть небольшая проблемка. Каждый рыцарь должен остановиться и сказать менестрелю, чтобы тот пел песню перед тем, как рыцарь сможет продолжить свой квест. Затем, после квеста, рыцарь должен помнить о том, чтобы сказать менестрелю, чтобы тот продолжил петь. Сам факт того, что рыцарь должен помнить о том, чтобы остановиться и сказать менестрелю что делать, отвлекает рыцаря.
В идеале, менестрель должен проявлять больше инициативы и автоматически петь песни без предупреждения. Рыцарь не должен знать (или даже заботиться) о том, что его действия записываются в песню. После всего, вы не должны допустить, чтобы ваш рыцарь опоздал на квесты из-за ленивого менестреля.
Есть еще аспектный вариант. Следует "обернуть" менестреля в в аспект, который добавляет свой песнепишущий сервис к рыцарю. Затем сервис менестреля покрывает функционал рыцаря, при чем сам рыцарь даже не подозревает, что менестрель здесь.