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();
}
循环依赖似乎消失了。但过了一段时间后,我开始考虑在这种情况下是否需要断开依赖:它只将所有方法从父类移动到子类,除此之外似乎没有任何好处。此外,它还有一个类,它的可读性较差,而且代码不太直接。
在这种情况下我应该留下循环依赖吗?还是有其他更好的设计模式来打破循环依赖?
答案 0 :(得分:0)
循环依赖总是很糟糕,我总是试图删除它。
为什么呢?因为它使代码变得脆弱,并且它直接打破了开/关原则。如果你必须修改一个类,那么你有99%的机会也必须修改另一个类。
破解循环依赖的选项很少,但我最喜欢的方法(我想从“大规模C ++软件设计”中)将两个类合并为一个。