c# - 扩展访问者/桥梁模式的两侧

标签 c# design-patterns visitor-pattern bridge

假设我有一个类层次结构,让我们使用经典的 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/

相关文章:

JAVA:如何限制一个类在一个级别上扩展

java - 两个参数的访问者模式

architecture - (嵌套?)多次调度【访客模式】

c# - 无法执行 not-in

c# - 在 Windows Azure 虚拟机上设置时区

c# - 为什么在这种情况下我会打印出 System.char[]?

c# - 你如何获得excel工作簿第一页的名称?

c++ - 这应该在模型中还是在 View 中?

javascript - 使用 BackBone.js 的小型计算器

design-patterns - 访问者模式和编译器代码生成,如何获取子属性?