1

我正在寻找关于最优雅和最安全的方法来解耦两个 C++ 类的建议,这些类维护指向彼此类型的指针集合。

我最近使用一个通用的多态基类实现了它,并被告知这是一个不令人满意的解决方案。我渴望学习其他可以实现这一目标的方法。

提前致谢...

我在下面添加了类定义的简化版本。我知道这个SalesTeam类并没有从SalesPerson这里解耦。

// Global Vectors
vector<Customer *> v_Customer;          
vector<SalesPerson *> v_SalesPerson;  
vector<SalesTeam *> v_SalesTeam;


class Person {    // Base Class
};

class Customer: public Person {
private:
    const Person *contact;         // This is the SalesPerson that serves the Customer
public:
    Customer(const int aBirthYear);
    virtual ~Customer() {}
};

class SalesPerson: public Person {
private:
    vector<Person *> v_Client;  // These are the customers that the SalesPerson serves
public:
    SalesPerson();
    virtual ~SalesPerson(){};
};

class SalesTeam {
private:
    vector<SalesPerson *> v_TeamMember;  // These are the sales people in the SalesTeam
public:
    SalesTeam();
};
4

3 回答 3

3

你可以使用调解器模式来处理这个解耦问题吗?代码示例:

class Mediator
{
    private:
        //store your relationship in this class
}

class SalesPerson: public Person {
private:
    Mediator mediator;
public:
    SalesPerson();
    virtual ~SalesPerson(){};
};

class SalesTeam {
private:
    Mediator mediator;
public:
    SalesTeam();
};
于 2013-08-29T02:27:13.840 回答
2

您的第一个解决方案令人不满意的部分是 Customer 和 SalesPerson 类包含彼此的引用,这使得管理起来非常麻烦。我认为“最佳”解决方案很大程度上取决于您打算如何让客户和销售人员相互交流。根据我对销售人员和客户的假设,我假设客户实际上并不需要销售人员,反之亦然,相反,他们的关系可能会在第三类中定义……例如交易。

class Transaction
{
  private:
    Customer *customer;
    SalesPerson *employee;
}

有数百甚至数千种设计模式,但没有适用于每种情况的通用模式。我建议在纸上画出你的对象并用箭头连接它们的参考;如果您绘制双向箭头(例如您的 Customer 和 SalesPerson 关系),则停止并重新评估。图表完成后,您可以使用箭头来可视化每个对象的界面,以了解所有内容如何组合在一起。

于 2013-08-29T02:42:08.630 回答
0

您可以通过使用前向声明来消除人员类。

// Global Vectors
vector<Customer *> v_Customer;          
vector<SalesPerson *> v_SalesPerson;  
vector<SalesTeam *> v_SalesTeam;

class SalesPerson; //<-- forward declaration for contact

class Customer {
    const SalesPerson *contact;
public:
    Customer(const int aBirthYear);
    virtual ~Customer() {}
};

class SalesPerson {
    vector<Customer *> v_Client;
public:
    SalesPerson();
    virtual ~SalesPerson(){};
};

class SalesTeam {
    vector<SalesPerson *> v_TeamMember;
public:
    SalesTeam();
};
于 2013-08-29T02:46:56.070 回答