在这种情况下是否需要打破循环依赖?

时间:2015-06-26 08:33:04

标签: c++ design-patterns circular-dependency

例如,考虑一个系统,它具有一个具有子控制器的全局主控制器,并且子控制器可以调用主控制器进行更新:

MainController.h

class SubController;
class MainController{
public:
    static void setGlobalMainController(MainController* mainController);
    static MainController* getGlobalMainController();
    void init();
    void updateSystem();
protected:
    SubController* subController;
};

MainController.cpp

#include "MainController.h"
#include "SubController.h"
MainController* globalMainController;
void MainController::setGlobalMainController(MainController* mainController){
    globalMainController=mainController;
}

MainController* MainController::getGlobalMainController(){
    return globalMainController;
}

void MainController::init(){
    this->subController=new SubController();
    //wait sub controller to press button...
}

void MainController::updateSystem(){
    //do something
}

SubController.h

class SubController{
protected:
    void onButtonPressed();
}

SubController.cpp

#include "SubController.h"
#include "MainController"
void SubController::onButtonPressed(){
    //do something...
    MainController::getGlobalMainController()->updateSystem();
}

SubController可以接受按钮事件,然后需要更新主控制器。

它具有循环依赖性,然后我尝试使用继承来破坏循环依赖:创建一个新类MainControllerImp并将MainController中的所有具体方法移动到MainControllerImp:

MainController.h

class SubController;
class MainController{
public:
    static void setGlobalMainController(MainController* mainController);
    static MainController* getGlobalMainController();
    virtual void init()=0;
    virtual void updateSystem()=0;
protected:
    SubController* subController;
};

MainController.cpp

#include "MainController.h"
#include "SubController.h"
MainController* globalMainController;
void MainController::setGlobalMainController(MainController* mainController){
    globalMainController=mainController;
}

MainController* MainController::getGlobalMainController(){
    return globalMainController;
}

MainControllerImp.h

#include "MainController.h"
class MainControllerImp : public MainController{
    virtual void init();
    virtual void updateSystem();
}

MainControllerImp.cpp

#include "MainControllerImp.h"
void MainControllerImp::init(){
    this->subController=new SubController();
    //wait sub controller to press button...
}

void MainControllerImp::updateSystem(){
    //do something
}

SubController.h

class SubController{
protected:
    void onButtonPressed();
}

SubController.cpp

#include "SubController.h"
#include "MainController"
void SubController::onButtonPressed(){
    //do something...
    MainController::getGlobalMainController()->updateSystem();
}

循环依赖似乎消失了。但过了一段时间后,我开始考虑在这种情况下是否需要断开依赖:它只将所有方法从父类移动到子类,除此之外似乎没有任何好处。此外,它还有一个类,它的可读性较差,而且代码不太直接。

在这种情况下我应该留下循环依赖吗?还是有其他更好的设计模式来打破循环依赖?

1 个答案:

答案 0 :(得分:0)

循环依赖总是很糟糕,我总是试图删除它。

为什么呢?因为它使代码变得脆弱,并且它直接打破了开/关原则。如果你必须修改一个类,那么你有99%的机会也必须修改另一个类。

破解循环依赖的选项很少,但我最喜欢的方法(我想从“大规模C ++软件设计”中)将两个类合并为一个。