我有一种情况,我必须发送邮件 A,有时我必须发送邮件 B,但也有一种情况,我想发送一封由邮件 A 和邮件 B 组合而成的邮件。
例如,邮件 A 的主题为“邮件 A 的主题”。邮件 B 的主题是“这是邮件 B 的主题”。现在我遇到了我想要这个作为我的主题的情况:'邮件 A 的主题/这是邮件 B 的主题'
如何使用 OO 方式实现这一目标?
我已经有两个单独的 mailA 和 mailB 类。
我有一种情况,我必须发送邮件 A,有时我必须发送邮件 B,但也有一种情况,我想发送一封由邮件 A 和邮件 B 组合而成的邮件。
例如,邮件 A 的主题为“邮件 A 的主题”。邮件 B 的主题是“这是邮件 B 的主题”。现在我遇到了我想要这个作为我的主题的情况:'邮件 A 的主题/这是邮件 B 的主题'
如何使用 OO 方式实现这一目标?
我已经有两个单独的 mailA 和 mailB 类。
假设您有一个具有两个属性的基类Mail
或接口,并且您可以创建一个派生类:IMail
Subject
Body
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));
}
}
}
这是复合模式的缩写实现。“缩写”,因为它不包含添加、删除或枚举子项的方法。如果要添加此功能,只需CompositeMail
另外实现ICollection<Mail>
.
你可以像这样实例化它:
var compositeMail = new CompositeMail(mailA, mailB);
您可以在使用普通邮件的任何地方使用此实例,因为它派生自Mail
您在其他地方使用的类。