首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于泛型的架构/最佳实践问题

关于泛型的架构/最佳实践问题
EN

Stack Overflow用户
提问于 2011-08-16 21:14:20
回答 1查看 2K关注 0票数 3

我正在学习“head first设计模式”,并希望立即将其用于实践。我正在编写一段连接应用程序和其他应用程序的代码。实际上,我需要生成一个包含XML文件的电子邮件,并通过电子邮件发送它。但将来可能还需要其他东西。

因此,我确定了“改变的东西”:-传输的数据-传输的方式(可以是电子邮件,但也可以是FTP或webservice用于另一种数据交换)

因此,我:-创建了一个抽象类DataObject -创建了一个接口ITransmissionMethod -创建了一个dataExchange抽象类:

代码语言:javascript
复制
  abstract class DataExchange<T,U>
    {
        private T DataObject;
        private U SendMethod;
    }

而SendViaMail就像是

代码语言:javascript
复制
class SendViaMail : ISendMethod<System.Net.Mail.Attachment>
{
    public override void Send(System.Net.Mail.Attachment dataItem)
    {
        throw new NotImplementedException();
    }
}

现在-我可以创建如下类:

代码语言:javascript
复制
class MyExchange : DataExchange<MyDataObject,SendViaMail> { }

你对这种方法有什么看法?现在,我真正想做的是在DataExchange中创建一个抽象方法,如下所示

代码语言:javascript
复制
private abstract [the type of the T in ISendMethod<T>] PrepareObjectForSending(T dataObject) {
}

Visual Studio会迫使我实现如下方法:

代码语言:javascript
复制
private abstract System.Net.Mail.Attachment PrepareObjectForSendingMyDataObject dataObject) {
// Serialize XML file and make it into attachment object
}

那不是很甜蜜吗?但是你们对这种方法怎么看呢?在未来,人们可以创建新的dataObjects和新的sendmethod,并且代码仍然可以工作。我一直在尝试做的是:对界面进行编程,并提取变化的部分。怎么样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-04 23:09:35

这是可行的,但您可以更多地分离关注点。这只是另一个版本-让DataExchange变得非常简单,并将真正的工作委托给工人:

代码语言:javascript
复制
class DataExchange<TDataObject, TTransmissionObject>
{
    IConverter<TDataObject, TTransmissionObject> conterver;
    ISendMethod<TTransmissionObject> sender;

    public Send(TDataObject dataObject)
    {
        TTransmissionObject tro = conterver.Convert(dataObject);
        sender.Send(tro);
    }
}

转换只是将数据对象转换为适合传输的对象:

代码语言:javascript
复制
class DataToAttachmentConverter : IConverter<DataObject, Attachment>
{
    Attachment Convert(DataObject) { }
}
class DataToXmlConverter : IConverter<DataObject, XmlDocument>
{
    XmlDocument Convert(DataObject) { }
}

发送者只会发送。

代码语言:javascript
复制
class MailSender : ISendMethod<Attachment>
{
    void Send(Attachment) {}
}
class FtpPublisher : ISendMethod<XmlDocument>
{
    void Send(XmlDocument) {}
}

把所有这些放在一起:

代码语言:javascript
复制
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.
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7078758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档