Предположим, что у меня есть класс Monkey, который иногда должен приобретать экземпляр Банана. Способ, которым этот банан предоставляется, не представляет интереса обезьяны, но он инициирует получение бананов.
Теперь у меня есть как минимум три возможных способа подключения моей обезьяны к поставщику бананов. Каков наилучший способ сделать это?
1. Событие
Поднять событие Monkey.BananaNeeded. Обработчик событий устанавливает свойство BananaNeededEventArgs.Banana.
2. Интерфейс
Вызвать IBananaProvider.GetBanana. Экземпляр IBananaProvider вводится в обезьяне как аргумент конструктора или через свойство.
3. Делегат
Вызовите делегата типа System.Func<Banana>. Делегат вводится в обезьяну как аргумент конструктора или через свойство. Это заманчиво, потому что это не требует объявления каких-либо дополнительных интерфейсов или классов, но, по-видимому, это не популярный выбор.