假设我有一个类层次结构,让我们使用经典的 Shape
示例:
抽象类 Shape
圆:形状
正方形:形状
我有第二个渲染器类层次结构,它们以不同的方式处理形状的渲染:
抽象类 ShapeRenderer
HtmlShapeRenderer : ShapeRenderer
WindowsFormsShapeRenderer : ShapeRenderer
允许它们独立变化传统上需要使用桥接模式。允许在不修改 Shape
类的情况下扩展渲染操作通常会涉及访问者模式。
但是,这两者都专注于扩展实现方面而不是抽象方面。假设我想添加一个新的 Shape
,比如 Triangle
- 我也希望能够支持渲染 Triangle
。由于 Visitor 和 Bridge 模式都依赖于将抽象层次结构“扁平化”为一组方法,例如:
public abstract class ShapeRenderer
{
public abstract void RenderCircle(Circle c);
public abstract void RenderSquare(Square s);
}
扩展 Shape
层次结构的唯一方法是修改基础 ShapeRenderer
类的代码,这是一个重大变化。
Jon,澄清一下:使用 Bridge 或 Visitor 允许客户提供替代的渲染实现,但要求他们了解所有潜在的形状。我希望能够做的是允许客户端也能够扩展Shape
类并要求它们提供渲染他们的新类(class)的实现。这样,现有代码可以处理任何类型的 Shape
,而无需担心渲染它们的细节。
在 C# 中是否有针对此类问题的通用解决方案?
最佳答案
我认为它应该是一个重大改变。如果您添加一个形状,现有的渲染器显然无法应对 - 它们需要进行更改。
您可以更改 ShapeRenderer 以将 RenderTriangle() 添加为虚拟(非抽象)方法,该方法仅记录无法正确渲染的事实,然后一次修复一个渲染器,但从根本上说,您如果没有更多代码,将无法呈现新类型。
您真正希望实现什么样的非破坏性改变?
关于c# - 扩展访问者/桥梁模式的两侧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/353491/