面试题答案
一键面试- 设计思路:
- 策略模式:将不同的渲染策略(OpenGL、DirectX等)封装成独立的类,每个类实现特定的渲染方法。
- 模板元编程:通过模板参数将不同的策略类传递给派生类,在编译期确定使用的渲染策略,以实现代码复用和扩展性。
- 代码实现:
// 渲染策略基类
class RenderStrategyBase {
public:
virtual void render() = 0;
virtual ~RenderStrategyBase() = default;
};
// OpenGL渲染策略
class OpenGLRenderStrategy : public RenderStrategyBase {
public:
void render() override {
std::cout << "Using OpenGL to render." << std::endl;
}
};
// DirectX渲染策略
class DirectXRenderStrategy : public RenderStrategyBase {
public:
void render() override {
std::cout << "Using DirectX to render." << std::endl;
}
};
// 渲染器基类
template <typename Strategy>
class RendererBase {
protected:
Strategy strategy;
public:
void performRender() {
strategy.render();
}
};
// OpenGL渲染器派生类
class OpenGLRenderer : public RendererBase<OpenGLRenderStrategy> {
public:
void render() {
performRender();
}
};
// DirectX渲染器派生类
class DirectXRenderer : public RendererBase<DirectXRenderStrategy> {
public:
void render() {
performRender();
}
};
-
模板元编程和策略模式协同工作说明:
- 模板元编程:在
RendererBase
模板类中,通过模板参数<typename Strategy>
指定使用的渲染策略类。在编译期,编译器会根据传入的模板参数生成不同的RendererBase
实例化版本。例如,OpenGLRenderer
继承自RendererBase<OpenGLRenderStrategy>
,DirectXRenderer
继承自RendererBase<DirectXRenderStrategy>
,这样不同的渲染器可以复用RendererBase
中的基础渲染逻辑(如performRender
方法)。 - 策略模式:每个渲染策略类(如
OpenGLRenderStrategy
和DirectXRenderStrategy
)继承自RenderStrategyBase
,实现了特定的render
方法。RendererBase
通过组合的方式持有一个Strategy
类型的对象,并在performRender
方法中调用其render
方法,从而实现不同的渲染效果。这种方式使得添加新的渲染策略变得容易,只需要创建一个新的继承自RenderStrategyBase
的策略类,并在需要使用该策略的渲染器中通过模板参数传入即可,无需修改已有的代码,大大提高了代码的扩展性。
- 模板元编程:在
-
测试代码:
#include <iostream>
int main() {
OpenGLRenderer openglRenderer;
openglRenderer.render();
DirectXRenderer directXRenderer;
directXRenderer.render();
return 0;
}
这个框架通过模板元编程和策略模式的结合,有效地实现了代码复用和扩展性,能够轻松应对不同渲染策略的需求变化。