使用策略模式设计软件中的问题

问题描述 投票:0回答:1

我目前正在实现一个小型软件,我想在Mac OS和Window OS上进行此软件工作,因此我想在Mac环境中使用GLFW,在Windows环境中使用Window API(我知道GLFW是跨平台的,但这不是重点。 )

我的问题是设计实现问题:我创建了一个windowManager类,该类保留一个Window类的实例。此Window保留一个对象的实例,该对象是PatternWindow,其中PatternWindow是接口。我有一个实现PatternGLFW3_VULKAN的对象PatternWindow。该PatternGLFW3_VULKAN具有成员GLFWwindow * _window,并且PatternGLFW3_VULKAN_window初始化glfwCreateWindow(...)

class Window : public Singleton<Window>
{
public:
  somefunction(...)
  initializePatternWindow(unique_ptr<PatternWindow>&& patternWindow)
  unique_ptr<PatternWindow> getPatternWindow(){return _patternWindow;}

private:
  unique_ptr<PatternWindow> _patternWindow;
} 

class PatternWindow
{
public:
  PatternWindow();
  virtual ~PatternWindow();

  virtual void initialize() = 0;
  virtual void destroy   () = 0;

};



class PatternGLFW3_VULKAN : public PatternWindow
{
public:
  PatternGLFW3_VULKAN ();
  ~PatternGLFW3_VULKAN();

  virtual void initialize();
  virtual void destroy();

  const GLFWwindow& getWindow() const {return *_window;}

private:
  GLFWwindow * _window;
};

我的问题是关于我的getWindow()类中的PatternGLFW3_VULKAN函数;我如何在getWindow()类中创建虚拟PatternWindow函数,以便在运行时获取GLFWwindow*PatternGLFW3_VULKAN窗口。如果我在Mac OS环境中,则可以在GLFWwindow& getWindow()中创建虚拟函数PatternWindow,但是如果我在Window环境中运行软件,则GLFWwindow的虚拟函数getWindow()的类型patternWindow ]班级不正确...

如何在getWindow()中拥有虚拟的PatternWindow并在运行时返回Windows API屏幕返回GLFWwindow或实例?

编辑:


class PatternWindow
{
public:
  PatternWindow();
  virtual ~PatternWindow();

  virtual void initialize() = 0;
  virtual void destroy   () = 0;
  virtual /*UNKNOW TYPE AT THE COMPILATION*/ getWindow() = 0;

};
/*UNKNOW TYPE AT THE COMPILATION*/

是我的问题,我不知道如何处理,当我在Mac OS和Windows实例中进行Windows API编译时,在Mac OS和Windows实例中获得GLFWwindow *。

在我的软件的主循环中想要这样的东西

int main(int argc, char** argv)
{
//initialisation of all my managers ans the data ect..

  while(!WindowClosed(Window::getPatternWindow()->getWindow()))
  {
    //DO SOME STUFF
  }
}

我目前正在实现一个小型软件,我想在Mac OS和Window OS上进行此软件工作,所以我想在Mac环境中使用GLFW,在Windows环境中使用Window API(我知道GLFW是跨平台的...

c++ design-patterns glfw strategy-pattern
1个回答
1
投票

您正在走向的模式可以完成,但是您稍后可能会后悔。我从您的设置中推断出,您有两个WindowClosed()重载–一个参数为GLFWwindow的重载,另一个参数为WinAPI类型的重载。前者将使用GLFW方法检测窗口是否关闭,而后者将使用Windows API。一个问题是组织的问题:多少文件包含GLFW特定的方法?也许您甚至拥有同时包含GLFW方法和Win API方法的文件?这不一定是错误的,但从长远来看可能会很痛苦。另一个问题是该方法与传统的面向对象方法不同。

© www.soinside.com 2019 - 2024. All rights reserved.