我一直在尝试遵循依赖注入(inject)的原则,但是after reading this article, I know I'm doing something wrong.

这是我的情况:我的应用程序收到不同类型的物理邮件。所有传入的邮件都通过我的MailFunnel对象传递。

在运行时,MailFunnel从外部接收不同类型的消息:Box,Postcard和Magazine。

每种邮件类型都需要不同的处理方式。例如,如果有一个盒子进来,我可能需要在交付之前记录重量。因此,我有BoxHandlerPostcardHandlerMagazineHandler对象。

每次有新消息进入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();
    }
}

09-27 16:46