假设我们有一个经典的多态架构:
class Animal
{
virtual void eat() = 0;
};
class Frog : public Animal
{
virtual void eat() { ... }
};
class Chipmunk : public Animal
{
virtual void eat() { ... }
};
这很好。但是在渲染时,我可以像render
方法一样向Animal
基类添加虚拟eat
方法。
但是动物源文件依赖于正在使用的特定库。这不会使事情可以调节和维护。另外,它们的渲染代码基本上与它们无关。
将渲染特定代码放在派生类之外的有什么好方法?
当我说好的时候,我的意思是没有使用像重载方法那样为每个派生类返回不同的数字,所以我可以做一个大的 if ... else if ... 。< / p>
答案 0 :(得分:3)
查看Visitor Pattern - 虚拟render()
函数传递Visitor
的实例,然后调用Visitor.renderMe(this)
。然后,访问者根据需要重载renderMe
并包含特定于呈现的代码。
答案 1 :(得分:1)
或查看Bridge Pattern。
动物类可以有一个Render方法,但是不是将渲染方法实现到特定的API,而是将它们写入抽象渲染API。然后,您提供渲染API的一个或多个具体实现。现在,动物渲染与特定渲染技术分离,双方都依赖于中性的抽象API。
答案 2 :(得分:0)
依赖注入。
您可以提供通用
Animal>>render()
渲染器通过参数,然后在
内Animal>>render(Renderer r)
致电:
r.render(this).