Skip to content

Examples of design patterns written in C#. Most of the popular design patterns that can be used in application development are described here.

Notifications You must be signed in to change notification settings

qpashkaaa/Design-Patterns-.NET

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

10 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

What It This?

Examples of design patterns .NET 8

These are examples of design patterns written in C#. Most of the popular design patterns that can be used in application development are described here.

Examples

  • Design pattern: Strategy
using DesignPatterns.Interfaces;
using System.ComponentModel;

namespace DesignPatterns.Patterns.Behavioral;

/// <summary>
/// БтратСгия.
/// </summary>
/// <remarks>
/// ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ сСмСйства Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², инкапсуляция ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… ΠΈ обСспСчСниС взаимозамСняСмости.
/// 
/// ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ БтратСгия (Strategy) прСдставляСт шаблон проСктирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт Π½Π°Π±ΠΎΡ€ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², инкапсулируСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΈ обСспСчиваСт ΠΈΡ… Π²Π·Π°ΠΈΠΌΠΎΠ·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ. 
/// Π’ зависимости ΠΎΡ‚ ситуации ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ. 
/// ΠŸΡ€ΠΈ этом Π·Π°ΠΌΠ΅Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° происходит нСзависимо ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ.
/// 
/// <see cref="https://metanit.com/sharp/patterns/3.1.php"/>
/// </remarks>
[Description("БтратСгия: ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ сСмСйства Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², инкапсуляция ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… ΠΈ обСспСчСниС взаимозамСняСмости.\r\n\r\nΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ БтратСгия (Strategy) прСдставляСт шаблон проСктирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт Π½Π°Π±ΠΎΡ€ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², инкапсулируСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΈ обСспСчиваСт ΠΈΡ… Π²Π·Π°ΠΈΠΌΠΎΠ·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ. \r\nΠ’ зависимости ΠΎΡ‚ ситуации ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ. \r\nΠŸΡ€ΠΈ этом Π·Π°ΠΌΠ΅Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° происходит нСзависимо ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ.")]
internal class Strategy : IPattern
{
    /// <summary>
    /// Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ читатСля.
    /// </summary>
    interface IReader
    {
        void Parse(string url);
    }

    /// <summary>
    /// Π§ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ рСсурсов (ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒ стратСгий).
    /// </summary>
    class ResourceReader
    {
        private IReader _reader;
        public ResourceReader(IReader reader) => _reader = reader;
        public void SetStrategy(IReader reader) => _reader = reader;
        public void Read(string url) => _reader.Parse(url);
    }

    /// <summary>
    /// Π§ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ новостных сайтов.
    /// </summary>
    class NewsSiteReader : IReader
    {
        public void Parse(string url) => Console.WriteLine($"Π§Ρ‚Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… с новостного сайта: {url}");
    }

    /// <summary>
    /// Π§ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтСй.
    /// </summary>
    class SocialNetworkReader : IReader
    {
        public void Parse(string url) => Console.WriteLine($"Π§Ρ‚Π΅Π½ΠΈΠ΅ Π»Π΅Π½Ρ‚Ρ‹ новостСй ΠΈΠ· ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ сСти: {url}");
    }

    /// <summary>
    /// Π§ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ Telegram ΠΊΠ°Π½Π°Π»ΠΎΠ².
    /// </summary>
    class TelegramChannelReader : IReader
    {
        public void Parse(string url) => Console.WriteLine($"Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· Telegram-ΠΊΠ°Π½Π°Π»Π°: {url}");
    }

    /// <summary>
    /// ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° проСктирования.
    /// </summary>
    public void ShowExample()
    {
        ResourceReader resourceReader = new ResourceReader(new NewsSiteReader());
        string url = "https://news.com";
        resourceReader.Read(url);

        url = "https://vk.com";
        resourceReader.SetStrategy(new SocialNetworkReader());
        resourceReader.Read(url);

        url = "@telegram-channel";
        resourceReader.SetStrategy(new TelegramChannelReader());
        resourceReader.Read(url);
    }
}
  • Design pattern: Observer
using DesignPatterns.Interfaces;
using System.ComponentModel;

namespace DesignPatterns.Patterns.Behavioral;

/// <summary>
/// ΠΠ°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»ΡŒ.
/// </summary>
/// <remarks>
/// АвтоматичСскоС ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ зависимых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΠ± измСнСниях состояния.
/// 
/// ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ "ΠΠ°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»ΡŒ" (Observer) прСдставляСт повСдСнчСский шаблон проСктирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ "ΠΎΠ΄ΠΈΠ½ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ". 
/// Π’ этом ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ мноТСство Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Π΅ΠΉ. 
/// И ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ наблюдаСмого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° автоматичСски происходит ΠΎΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅ всСх Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Π΅ΠΉ.
/// 
/// <see cref="https://metanit.com/sharp/patterns/3.2.php"/>
/// </remarks>
[Description("ΠΠ°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»ΡŒ: АвтоматичСскоС ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ зависимых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΠ± измСнСниях состояния.\r\n\r\nΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ \"ΠΠ°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»ΡŒ\" (Observer) прСдставляСт повСдСнчСский шаблон проСктирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ \"ΠΎΠ΄ΠΈΠ½ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ\". \r\nΠ’ этом ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ мноТСство Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Π΅ΠΉ. \r\nИ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ наблюдаСмого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° автоматичСски происходит ΠΎΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅ всСх Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Π΅ΠΉ.")]
internal class Observer : IPattern
{
    /// <summary>
    /// Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Ρ.
    /// </summary>
    interface IObserver
    {
        void Update(double price);
    }

    /// <summary>
    /// Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ наблюдаСмого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.
    /// </summary>
    interface IObservable
    {
        void AddObserver(IObserver observer);
        void RemoveObserver(IObserver observer);
        void Notify();
    }

    /// <summary>
    /// Класс ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° (Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚).
    /// </summary>
    class Product : IObservable
    {
        private List<IObserver> _observers;
        private double _price;
        public Product(double price)
        {
            Console.WriteLine($"Бтартовая Ρ†Π΅Π½Π° ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° {price}");
            _price = price;
            _observers = new List<IObserver>();
        }
        public void ChangePrice(double price)
        {
            Console.WriteLine($"Π¦Π΅Π½Π° Π½Π° ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ измСнилась. Новая Ρ†Π΅Π½Π°: {price}");
            _price = price;
            Notify();
        }
        public void AddObserver(IObserver observer)
        {
            _observers.Add(observer);
        }
        public void RemoveObserver(IObserver observer) 
        { 
            _observers.Remove(observer);
        }
        public void Notify()
        {
            foreach (var observer in _observers.ToList())
            {
                observer.Update(_price);
            }
        }
    }

    /// <summary>
    /// Класс ΠΎΠΏΡ‚ΠΎΠ²ΠΎΠ³ΠΎ покупатСля (Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»ΡŒ).
    /// </summary>
    class Wholesale : IObserver
    {
        private IObservable _observable;
        public Wholesale(IObservable observable)
        {
            _observable = observable;
            _observable.AddObserver(this);
        }
        public void Update(double price)
        {
            if (price < 300)
            {
                Console.WriteLine($"{nameof(Wholesale)} Π·Π°ΠΊΡƒΠΏΠΈΠ» Ρ‚ΠΎΠ²Π°Ρ€ ΠΏΠΎ Ρ†Π΅Π½Π΅: {price}.");
                _observable.RemoveObserver(this);
            }
        }
    }

    /// <summary>
    /// Класс ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ покупатСля (Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»ΡŒ).
    /// </summary>
    class Buyer : IObserver
    {
        private IObservable _observable;
        public Buyer(IObservable observable)
        {
            _observable = observable;
            _observable.AddObserver(this);
        }
        public void Update(double price)
        {
            if (price < 350)
            {
                Console.WriteLine($"{nameof(Buyer)} Π·Π°ΠΊΡƒΠΏΠΈΠ» Ρ‚ΠΎΠ²Π°Ρ€ ΠΏΠΎ Ρ†Π΅Π½Π΅: {price}.");
                _observable.RemoveObserver(this);
            }
        }
    }

    /// <summary>
    /// ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° проСктирования.
    /// </summary>
    public void ShowExample()
    {
        Product product = new Product(400);
        Wholesale wholesale = new Wholesale(product);
        Buyer buyer = new Buyer(product);

        Console.WriteLine();

        product.ChangePrice(550);

        Console.WriteLine();

        product.ChangePrice(530);

        Console.WriteLine();

        product.ChangePrice(320);

        Console.WriteLine();

        product.ChangePrice(280);

        Console.WriteLine();

        product.ChangePrice(120);
    }
}

Tech Stack

  • .NET 8

Authors

Contacts

Year of Development

2024