3

我有一种情况,我必须发送邮件 A,有时我必须发送邮件 B,但也有一种情况,我想发送一封由邮件 A 和邮件 B 组合而成的邮件。

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

如何使用 OO 方式实现这一目标?

我已经有两个单独的 mailA 和 mailB 类。

4

1 回答 1

8

假设您有一个具有两个属性的基类Mail或接口,并且您可以创建一个派生类:IMailSubjectBodyCompositeMail

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));
        }
    }
}

这是复合模式的缩写实现。“缩写”,因为它不包含添加、删除或枚举子项的方法。如果要添加此功能,只需CompositeMail另外实现ICollection<Mail>.

你可以像这样实例化它:

var compositeMail = new CompositeMail(mailA, mailB);

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

于 2013-04-12T11:05:57.090 回答