我有一个名为App的类,它将实例化并拥有一组类型为Agents的类,每个类都将实例化并拥有一组Listeners。所有权是唯一的,不可转让的,因此,显然,std::unique_ptr.虽然对很多人来说它们通常不是很好,但是拥有的std::vector<std::unique_ptr>在数量上可能会有所不同,因此,一个ownees是很好的。
在编译时,根据某些指令,我可以判断哪个Agents是App需要的,哪个Listeners是每个Agent都需要的。Agents到App,或者Listeners到每个Agent,未来可能会有所不同,但总是在编译时,一旦程序被设置为运行,什么都不会改变,直到一个新版本的程序被部署。
所以问题是,我怎样才能以一种有组织和未来的方式来实现所有这些类似树的层次结构呢?
我试着实现了一个工厂方法模式,它将把正确的Agents交给App (根据编译时标志,只需添加一个不同的工厂),但是我还是有点纠结于如何以同样干净的方式告诉Agents他们需要哪一个Listener。我又想起了Listeners的一家工厂,该工厂以Agent为参数,然后有一个可怕的开关声明,询问Agent的类型,并把他的Listeners给了他,但这似乎很快就会变得一团糟。
PD:使用VC2010,它只是部分符合C++11,完全符合TR1。
发布于 2018-10-03 19:54:03
通过让您的App负责创建其Agents和Agents,负责创建它们的Listeners,您将创建所有者对ownee的强烈依赖,从而使您无法灵活地选择其他类型的代理或侦听器。
使用工厂是一个很好的开始,因为可以为工厂提供参数来实例化不同类型的代理或侦听器。但是,这还不够,因为您的类将依赖硬连接的工厂而不是拥有的类。
解决方案是使用依赖注入。因此,与其让App创建Agent,让Agent创建Listener,不如注入工厂。
缺点?由于您希望从自下而上的依赖项中解脱出来,并且希望配置要自上而下使用的类,所以依赖项注入必须是多层次的。因此,如果树的深度为3,则需要为创建应用程序注入3个不同的工厂。
因为您正在创建一个相关对象系列,所以可以插入一个单独的抽象工厂来创建不同类型的对象,而不是注入多个工厂。
在使用一种编译时程序集时,还可以考虑使用基于策略的设计。这本书的第一版使这种设计很受欢迎,可以追溯到2001年,所以它不需要C++11。
其思想是使用模板在编译时注入策略(又名战略模式)。这是一种非常强大和灵活的方法,但它需要将一些类切换到模板类。有几种情况是可能的,例如:
这种方法的优点之一是,模板还可以使您免于使用vector<unique_ptr<...>>实现所有权,而选择使用简单的向量。
发布于 2018-10-03 19:34:15
我可能会使用一种数据驱动的方法:创建一些简单的数据格式来捕获所需代理的相关细节(比如他们的名称),以及每个人想要的侦听器的细节。
您的代码将通过这种简单的数据格式运行,并创建代理它们的侦听器,并将它们链接到一起。
这些数据可以来自编译时初始化的静力学(如果您想要构建它),或者以后可以来自配置文件。
创建Agents的工厂方法不一定是App使用的--只是创建层次结构的初始化方法。或者可能是工厂方法,尽管App是层次结构的顶层对象,将由工厂方法返回。
https://softwareengineering.stackexchange.com/questions/379395
复制相似问题