在某些情况下,我必须发送邮件A,有时又必须发送邮件B,但是在某些情况下,我想发送包含邮件A和邮件B的邮件。

例如,邮件A的主题为“邮件A的主题”。邮件B的主题为“这是邮件B的主题”。现在,我遇到了这样的情况:“邮件A的主题/这是邮件B的主题”

我如何使用面向对象的方法实现这一目标?

我已经有两个单独的类,分别用于mailA和mailB。

最佳答案

假设您有一个基类Mail-或接口IMail-具有两个属性SubjectBody,则可以创建派生类CompositeMail

public class CompositeMail : Mail
{
    private readonly List<Mail> _mails;

    public CompositeMail(params Mail[] mails) : this(mails.AsEnumerable())
    {
    }

    public CompositeMail(IEnumerable<Mail> mails)
    {
        if(mails == null) throw new ArgumentNullException("mails");

        _mails = mails.ToList();
    }

    public override string Subject
    {
        get { return string.Join("/", _mails.Select(x => x.Subject)); }
    }

    public override string Body
    {
        get
        {
            return string.Join(Environment.NewLine, _mails.Select(x => x.Body));
        }
    }
}


这是Composite pattern的缩写实现。 “缩写”,因为它不包含添加,删除或枚举子代的方法。如果要添加此功能,只需使CompositeMail另外实现ICollection<Mail>

您可以这样将其实例化:

var compositeMail = new CompositeMail(mailA, mailB);


您可以在使用普通邮件的任何地方使用此实例,因为它源自您在其他地方使用的Mail类。

10-05 20:15
查看更多