假设我有一组类别的层级结构,让我们使用经典的形状(Shape)
示例:
abstract class Shape
Circle : Shape
Square : Shape
我有第二个渲染器类层次结构,它以不同的方式处理形状的渲染:
abstract class ShapeRenderer
HtmlShapeRenderer : ShapeRenderer
WindowsFormsShapeRenderer : ShapeRenderer
允许它们独立变化通常需要使用桥接模式。允许渲染操作在不修改Shape
类的情况下扩展通常需要使用访问者模式。
然而,这两种方式都仅专注于扩展实现方面,而非抽象方面。比如说,我想添加一个新的Shape
,比如Triangle
,我也希望能够支持渲染Triangle
。由于访问者模式和桥接模式都依赖于将抽象层级压缩为一组方法,例如:
public abstract class ShapeRenderer
{
public abstract void RenderCircle(Circle c);
public abstract void RenderSquare(Square s);
}
唯一扩展Shape
层次结构的方法是修改基础ShapeRenderer
类的代码,这是一种破坏性的变更。
乔恩,澄清一下:使用桥接器或访问者允许客户端提供替代渲染实现,但需要他们了解所有潜在的形状。我想做的是允许客户端也可以扩展Shape
类并要求他们为他们的新类提供渲染实现。这样,现有的代码可以使用任何类型的Shape
,而不必担心渲染的具体情况。
在C#中,这种问题有通用的解决方案吗?