Run*_*ble 4 c++ dependency-injection
我一直在尝试遵循依赖注入的原则,但在阅读本文后,我知道我做错了什么.
这是我的情况:我的应用程序收到不同类型的物理邮件.所有传入的邮件都通过我的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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1319 次 |
| 最近记录: |