我正在努力完成'头脑设计模式',并希望立即在实践中使用它。 我正在编写一段将应用程序与其他应用程序连接起来的代码。实际上,我需要生成一个包含XML文件的电子邮件,并通过电子邮件发送。但是将来可能还需要其他东西。
因此,我确定了“改变的事物”: - 传输数据 - 传输方式(可以是电子邮件,但可以是FTP或Web服务进行其他数据交换)
所以,我: - 创建了一个抽象类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和新的sendmethods,代码仍然有效。我一直在努力做的是:针对界面编程并提取更改部分。怎么样?
答案 0 :(得分:4)
这样可行,但你可以将问题分开。这是另一个版本 - 使DataExchange非常简单,并将实际工作委派给工人:
class DataExchange<TDataObject, TTransmissionObject>
{
IConverter<TDataObject, TTransmissionObject> conterver;
ISendMethod<TTransmissionObject> sender;
public Send(TDataObject dataObject)
{
TTransmissionObject tro = conterver.Convert(dataObject);
sender.Send(tro);
}
}
转换只会将数据对象转换为适合传输的对象:
class DataToAttachmentConverter : IConverter<DataObject, Attachment>
{
Attachment Convert(DataObject) { }
}
class DataToXmlConverter : IConverter<DataObject, XmlDocument>
{
XmlDocument Convert(DataObject) { }
}
发件人只会发送。
class MailSender : ISendMethod<Attachment>
{
void Send(Attachment) {}
}
class FtpPublisher : ISendMethod<XmlDocument>
{
void Send(XmlDocument) {}
}
全部放在一起:
var exchanges = new [] {
new DataExchange<DataObject, Attachment>( new DataToAttachmentConverter(), new MailSender()),
new DataExchange<DataObject, XmlDocument>( new DataToXmlConverter(), new FtpPublisher())
};
foreach(var ex in exchanges)
ex.Send(dataObject); //send as an attachent and put to ftp site.