gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:44:29 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com