我一直在尝试遵循依赖注入(inject)的原则,但是after reading this article, I know I'm doing something wrong.
这是我的情况:我的应用程序收到不同类型的物理邮件。所有传入的邮件都通过我的MailFunnel
对象传递。
在运行时,MailFunnel
从外部接收不同类型的消息:Box,Postcard和Magazine。
每种邮件类型都需要不同的处理方式。例如,如果有一个盒子进来,我可能需要在交付之前记录重量。因此,我有BoxHandler
,PostcardHandler
和MagazineHandler
对象。
每次有新消息进入MailFunnel
时,我都会实例化一个新的对应MailHandler
对象。
例如:
MailFunnel类
{
void NewMailArrived(Mail mail)
{
开关(mail.type)
{
情况箱:
BoxHandler * bob =新的BoxHandler(shreddingPolicy,maxWeightPolicy);
bob-> get_to_work();
休息;
案例明信片:
PostcardHandler *坦率=新的PostcardHandler(coolPicturePolicy);
frank-> get_to_work();
休息;
案例杂志:
MagazineHandler * nancy =新的MagazineHandler(censorPolicy);
nancy-> get_to_work();
休息;
}
}
私有(private)的:
MaxWeightPolcy和maxWeightPolicy;
ShreddingPolicy和shreddingPolicy;
CoolPicturePolicy和coolPicturePolicy;
CensorPolicy和censorPolicy;
}
一方面,这很棒,因为这意味着如果我收到五封不同的邮件,我将立即同时使用五种不同的MailHandlers
处理业务。但是,这也意味着I'm mixing object creation with application logic-在依赖注入(inject)方面非常重要。
此外,我在MailFunnel
确实不需要的MailFunnel
对象中散布了所有这些策略引用。 MailFunnel
具有这些对象的唯一原因是将它们传递给MailHandler
构造函数。同样,this is another thing I want to avoid。
欢迎所有建议。谢谢!
最佳答案
在我看来,这更像是一家工厂。将get_to_work()方法的调用移出调用并返回处理程序。该模式对于工厂来说效果很好。
class MailHandlerFactory
{
IMailHandler* GetHandler( Mail mail )
{
switch (mail.type)
{
case BOX:
return new BoxHandler(shreddingPolicy, maxWeightPolicy);
break;
case POSTCARD:
return new PostcardHandler(coolPicturePolicy);
break;
case MAGAZINE:
return new MagazineHandler(censorPolicy);
break;
}
}
private:
MaxWeightPolcy & maxWeightPolicy;
ShreddingPolicy & shreddingPolicy;
CoolPicturePolicy & coolPicturePolicy;
CensorPolicy & censorPolicy;
}
class MailFunnel
{
MailHandlerFactory* handlerFactory;
MailFunnel( MailHandlerFactory* factory ) {
handlerFactory = factory;
}
void NewMailArrived( Mail mail ) {
IMailHandler handler = handlerFactory.GetHandler(mail);
handler.get_to_work();
}
}