Это шаблон декоратора? - PullRequest
3 голосов
/ 05 января 2009

Я использую встроенный системный класс для отправки писем в .NET. Он находится в пространстве имен System.Mail или что-то в этом роде.

Мне нужно добавить интерфейс к этому классу, чтобы я мог поменять его для тестирования или другой реализации.

Для этого я просто определяю класс, который оборачивает этот встроенный класс?

Это пример шаблона декоратора? Я просто немного запутался, потому что в описании шаблона декоратора обычно говорится, что он используется для добавления функциональности, и я не буду добавлять ничего.

Ответы [ 2 ]

3 голосов
/ 05 января 2009

Ну, это звучит так же, как инкапсуляция (класс-оболочка) и абстракция (интерфейс).

Однако, если у вас есть интерфейс, вы можете , а затем использовать шаблон декоратора.

Строго говоря, при использовании декоратора каждый слой имеет такой же интерфейс; Декорация, по сути, представляет собой последовательную цепочку из различных конкретных классов, которые (при реализации интерфейса) либо передают метод к ссылке next в цепочке, либо делают что-то сделанное на заказ.

( update : я не говорю, что должен сделать это таким образом - это всего лишь пример того, как шаблон декоратора может работать в контексте оригинального e почта)

Например, у вас может быть интерфейс IEmail, базовая реализация BasicEmail (которая использует встроенный код .NET), LoggingEmail, который принимает IEmail и просто передает данные ( но регистрирует вещи по ходу дела) и ForwardingEmail, который принимает IEmail и изменяет To и т. д. (возможно, для целей dev / test / live).

Тогда вы могли бы иметь:

`ForwardingEmail` => `LoggingEmail` => `BasicEmail` => (regular .NET classes)

(где первые три известны только как IEmail)

Это позволяет расширить функциональность без изменения API. Очень часто встречается в заводских / IoC-установках, и особенно в AOP.

2 голосов
/ 05 января 2009

Нет, это не шаблон декоратора, это шаблон прокси, обратите внимание: я думаю, что Microsoft ожидает, что вы сделаете так, чтобы ваш тестовый класс наследовал от класса SmtpClient, и самостоятельно реализовали Send, AsynchSend и т. Д. просто напишите в текстовый файл или что-то еще - если вы хотите подключить тестовую версию). Однако, если вы хотите сделать это правильным способом, а не Microsoft, сделайте это так, как сказал Марк. В .NET вы найдете все больше и больше примеров того, как интерфейсы не были там, когда они должны были быть.

...