2011-03-02 130 views
3

比方说,我们有一个经典的多态结构:外部化渲染

class Animal 
{ 
    virtual void eat() = 0; 
}; 

class Frog : public Animal 
{ 
    virtual void eat() { ... } 
}; 

class Chipmunk : public Animal 
{ 
    virtual void eat() { ... } 
}; 

这是好的。但是在渲染时,我可以像eat方法一样将虚拟render方法添加到Animal基类。

但是,然后动物源文件依赖于正在使用的特定库。这不会使事情变得可调整和可维护。另外,他们的渲染代码基本上不涉及它们。

什么是将呈现特定代码从派生类中移出的好方法?

当我说的很好时,我的意思是不使用类似重载的方法,为每个派生类返回一个不同的数字,所以我可以做一个大的if ... else if ...

回答

3

看一看的Visitor Pattern - 虚拟render()函数传递一个Visitor的一个实例,然后调用Visitor.renderMe(this)。访客随后根据需要重载renderMe并包含呈现特定代码。

+0

+1这正是访客模式要解决的问题。 – 2011-03-03 01:23:04

1

或退房Bridge Pattern

动物类可以有Render方法,但不是将渲染方法实现为特定的API,而是将它们写入抽象渲染API。然后你提供一个或多个渲染API的具体实现。现在动物渲染与特定的渲染技术分离,双方都依赖于中性的抽象API。