C++异步创建对象

问题描述:

的我现在有一个异步API,其中一个Manager类是负责创建A类,BC等创建是异步的其他对象,并且每次调用一个函数manager.createXXX()将伴随其回调on_createXXX_done(A& a)C++异步创建对象

创建A,B,C对象需要是连续的。而API的典型用法将涉及创建A,并在其回调中触发创建B等等。

这涉及到创建逻辑分裂成许多功能,我觉得很丑。此外,创建所有对象后需要执行的操作需要在最后创建的对象(C)的回调中编码,即使该对象与要执行的操作之间没有直接关系。

生成器设计模式实际上并不适合,因为管理者不拥有的对象ABC,它只是帮助上创建并返回它们。

void on_creationA_done(A& a) 
{ 
    m_a = a; 
    //Trigger next creation 
    m_manager.createB() 
} 
void on_creationB_done(B& b) 
{ 
    m_b = b; 
    //Trigger next creation 
    m_manager.createC() 
} 

void on_creationC_done(C& c) 
{ 
    m_c = c; 
    //No more creations are needed. Just perform some post-creation actions 
    do_something() // This needs to be called once all A, B, C are created. 
} 

我还检查愚蠢/期货连锁异步操作,但会涉及通过我们的公共API暴露愚蠢库,对不对?

在这种情况下使用什么样的好模式?

将A,B,C创作链接在其回调中似乎有点限制(并且不可扩展)。如果将来需要实施更多用例,则必须在回调中处理这些用例,从而使代码过于复杂且不直观。

目前的情况下是一个特定的使用情况,应与其他管理器类的帮助来处理,我们称之为UseCaseABC,哪知道有关使用情况的具体要求,约束等

在你能UseCaseABC类跟踪A,B,C对象的创建,并在所有三个对象存在时调用do_something。

class UseCaseABC 
{ 

    void on_creationA_done(A& a) 
    { 
     m_A = a; 
     NotifyCreation(); 
    } 
    void on_creationB_done(B& b) 
    { 
     m_B = b; 
     NotifyCreation(); 
    } 
    void on_creationC_done(C& c) 
    { 
     m_C = c; 
     NotifyCreation(); 
    }  

    void NotifyCreation() 
    { 
     if (all three objects created) 
     { 
      do_something(); 

      ClearABCMembers(); 
     } 
    } 
} 

如果A,B,C对象的创建由许多客户端异步触发,你可以在一个线程安全的方式访问对象池更换M_A,M_B,M_C实例。

+0

我不太同意这个解决方案。经理类可以创建更多的对象(或更少)。假设您有来自A - Z的对象。每个用例或场景都可以请求创建对象的任何子集。这使得你的解决方案变得不可能,因为你需要为每个子集创建一个UseCase类,所以N个子集(N = pow(2,集合中的对象数)) – FCR

+0

决定是否必须创建单独的用例类或一般来处理所有情况。这取决于每个用例的复杂程度和它们的数量。 – GeorgeT