Перейти к содержанию

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());
        }
    }
}