Bridge.cs
Код подключён напрямую из исходного файла в кодировке UTF-8, поэтому эта страница всегда показывает его актуальную версию.
← К конспекту
Скачать исходный файл
| Bridge.cs |
|---|
| using System;
namespace DesignPatterns.Structural.Bridge
{
// Реализация: низкоуровневые операции конкретной платформы вывода.
public interface IRenderer
{
string RenderCircle(double radius);
}
public sealed class VectorRenderer : IRenderer
{
public string RenderCircle(double radius) =>
$"Векторный круг радиуса {radius}";
}
public sealed class RasterRenderer : IRenderer
{
public string RenderCircle(double radius) =>
$"Растровый круг радиуса {radius} из пикселей";
}
// Абстракция развивается независимо от иерархии реализаций.
public abstract class Shape
{
protected Shape(IRenderer renderer) => Renderer = renderer;
protected IRenderer Renderer { get; }
public abstract string Draw();
}
public class Circle : Shape
{
public Circle(IRenderer renderer, double radius) : base(renderer) =>
Radius = radius;
public double Radius { get; }
public override string Draw() => Renderer.RenderCircle(Radius);
}
// Расширенная абстракция не требует новых RasterCircle/VectorCircle.
public sealed class LabeledCircle : Circle
{
public LabeledCircle(IRenderer renderer, double radius, string label)
: base(renderer, radius) => Label = label;
public string Label { get; }
public override string Draw() => $"{Label}: {base.Draw()}";
}
public static class Demo
{
public static void Run()
{
Shape vector = new Circle(new VectorRenderer(), 10);
Shape rasterWithLabel = new LabeledCircle(new RasterRenderer(), 5, "Аватар");
Console.WriteLine(vector.Draw());
Console.WriteLine(rasterWithLabel.Draw());
}
}
}
|