Я пробираюсь сквозь «шаблоны проектирования с первого взгляда» и хочу немедленно использовать это на практике.
Я пишу кусок кода, который связывает приложение с другими приложениями. На самом деле мне нужно сгенерировать электронное письмо, содержащее файл XML, и отправить его по электронной почте. Но в будущем могут потребоваться другие вещи.
Таким образом, я определил «вещи, которые меняются»:
- данные для передачи
- Средства передачи (могут быть электронной почтой, но могут быть FTP или веб-сервис для другого обмена данными)
Итак, я:
- создан абстрактный класс DataObject
- Создан интерфейс ITransmissionMethod
- Создан абстрактный класс dataExchange:
abstract class DataExchange<T,U>
{
private T DataObject;
private U SendMethod;
}
И SendViaMail похож на
class SendViaMail : ISendMethod<System.Net.Mail.Attachment>
{
public override void Send(System.Net.Mail.Attachment dataItem)
{
throw new NotImplementedException();
}
}
Теперь - я могу создавать классы, такие как:
class MyExchange : DataExchange<MyDataObject,SendViaMail> { }
Что вы думаете об этом подходе? Теперь я действительно хотел бы создать абстрактный метод в DataExchange, который должен выглядеть примерно так:
private abstract [the type of the T in ISendMethod<T>] PrepareObjectForSending(T dataObject) {
}
Visual Studio заставит меня реализовать такой метод, как:
private abstract System.Net.Mail.Attachment PrepareObjectForSendingMyDataObject dataObject) {
// Serialize XML file and make it into attachment object
}
Разве это не было бы мило? Но что вы, ребята, думаете об этом подходе? В будущем люди могут создавать новые dataObjects и новые методы отправки, и код все равно будет работать. То, что я пытался сделать, это: запрограммировать интерфейс и извлечь изменяющиеся части. Как насчет этого?