クラスの階層があるとします。古典的な例を使用しましょうShape
。
abstract class Shape
Circle : Shape
Square : Shape
さまざまな方法で形状のレンダリングを処理するレンダラー クラスの 2 番目の階層があります。
abstract class ShapeRenderer
HtmlShapeRenderer : ShapeRenderer
WindowsFormsShapeRenderer : ShapeRenderer
これらを個別に変更できるようにするには、従来、ブリッジ パターンを使用する必要がありました。クラスを変更せずにレンダリング アクションを拡張できるようにするには、Shape
従来、Visitor パターンが必要でした。
ただし、これらは両方とも、抽象化側ではなく、実装側の拡張のみに焦点を当てています。新しい を追加したいとします。Shape
たとえば、Triangle
のレンダリングもサポートできるようにしたいとしTriangle
ます。Visitor パターンと Bridge パターンの両方が、抽象化階層を一連のメソッドに「フラット化」することに依存しているため、次のようになります。
public abstract class ShapeRenderer
{
public abstract void RenderCircle(Circle c);
public abstract void RenderSquare(Square s);
}
階層を拡張する唯一の方法Shape
は、基本クラスのコードを変更するShapeRenderer
ことです。これは重大な変更です。
ジョン、明確にするために:ブリッジまたはビジターを使用すると、クライアントは代替のレンダリング実装を提供できますが、潜在的なすべてのシェイプについて知る必要があります。私ができるようにしたいのは、クライアントがクラスを拡張できるようにし、新しいクラスのレンダリング実装を提供するようにクライアントに要求することです。このように、既存のコードは、レンダリングの詳細を気にすることなく、あらゆるタイプの で動作します。Shape
Shape
C# で使用できるこの種の問題に対する一般的な解決策はありますか?