2011-03-02 129 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。