我一直在尝试遵循依赖注入的原则,但在阅读本文后,我知道我做错了什么.
这是我的情况:我的应用程序收到不同类型的物理邮件.所有传入的邮件都通过我的MailFunnel
对象.
在它运行时,MailFunnel
从外部接收不同类型的消息:Box,Postcard和Magazine.
每种邮件类型都需要以不同方式处理.例如,如果Box进来,我可能需要在交付之前记录重量.因此,我有BoxHandler
,PostcardHandler
和MagazineHandler
对象.
每次有新消息进入我的时候MailFunnel
,我都会实例化一个新的相应MailHandler
对象.
例如:
class MailFunnel { void NewMailArrived( Mail mail ) { switch (mail.type) { case BOX: BoxHandler * bob = new BoxHandler(shreddingPolicy, maxWeightPolicy); bob->get_to_work(); break; case POSTCARD: PostcardHandler * frank = new PostcardHandler(coolPicturePolicy); frank->get_to_work(); break; case MAGAZINE: MagazineHandler * nancy = new MagazineHandler(censorPolicy); nancy->get_to_work(); break; } } private: MaxWeightPolcy & maxWeightPolicy; ShreddingPolicy & shreddingPolicy; CoolPicturePolicy & coolPicturePolicy; CensorPolicy & censorPolicy; }
一方面,这很好,因为这意味着如果我收到五封不同的邮件,我会立即有五个不同的MailHandlers
工作同时处理业务.但是,这也意味着我正在将对象创建与应用程序逻辑混合 - 当涉及到依赖注入时,这是一个很大的禁忌.
此外,我所有这些政策参考都悬挂在我真正不需要的MailFunnel
对象中MailFunnel
.MailFunnel
拥有这些对象的唯一原因是将它们传递给MailHandler
构造函数.同样, 这是我想要避免的另一件事.
欢迎所有建议.谢谢!
这看起来更像是我的工厂.将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(); } }